C++: Convert text file of integers into a bitmap image file in BMP format

后端 未结 5 2138
我在风中等你
我在风中等你 2020-12-09 13:29

I have a text file being saved by a matrix library containing a 2D matrix as such:

1 0 0 
6 0 4
0 1 1

Where each number is represented with

5条回答
  •  猫巷女王i
    2020-12-09 13:49

    To output a readable BMP file, you need to put a header first:

    #include 
    
    DWORD dwSizeInBytes = rows*cols*4; // when your matrix contains RGBX data)
    
    // fill in the headers
    BITMAPFILEHEADER bmfh;
    bmfh.bfType = 0x4D42; // 'BM'
    bmfh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSizeInBytes;
    bmfh.bfReserved1 = 0;
    bmfh.bfReserved2 = 0;
    bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
    BITMAPINFOHEADER bmih;
    bmih.biSize = sizeof(BITMAPINFOHEADER);
    bmih.biWidth = cols;
    bmih.biHeight = rows;
    bmih.biPlanes = 1;
    bmih.biBitCount = 32;
    bmih.biCompression = BI_RGB;
    bmih.biSizeImage = 0;
    bmih.biXPelsPerMeter = 0;
    bmih.biYPelsPerMeter = 0;
    bmih.biClrUsed = 0;
    bmih.biClrImportant = 0;
    

    Now before you write your color information, just write the bitmap header

    fwrite(&bmfh, sizeof(bmfh),1, bmp_ptr);
    fwrite(&bmih, sizeof(bmih),1, bmp_ptr);
    

    And finally the color information:

    fwrite(&intmatrix, size, sizeof(int), bmp_ptr);
    

    Note, that the block size is sizeof(int), as your matrix doesn't contain single characters, but integers for each value. Depending on the content of your matrix, it might be a good idea to convert the values to COLORREF values (Check the RGB macro, which can be found in WinGDI.h, too)

提交回复
热议问题