linux灰度圖數組保存爲bmp圖像

typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef unsigned long LONG;



#pragma pack(1)
typedef struct tagBITMAPFILEHEADER {
    WORD    bfType;
    DWORD   bfSize;
    WORD    bfReserved1;
    WORD    bfReserved2;
    DWORD   bfOffBits;
} BITMAPFILEHEADER;


typedef struct tagBITMAPINFOHEADER {
    DWORD      biSize;
    LONG       biWidth;
    LONG       biHeight;
    WORD       biPlanes;
    WORD       biBitCount;
    DWORD      biCompression;
    DWORD      biSizeImage;
    LONG       biXPelsPerMeter;
    LONG       biYPelsPerMeter;
    DWORD      biClrUsed;
    DWORD      biClrImportant;
} BITMAPINFOHEADER;


typedef struct tagRGBQUAD {
    BYTE    rgbBlue;
    BYTE    rgbGreen;
    BYTE    rgbRed;
    BYTE    rgbReserved;
} RGBQUAD;
#pragma pack()

void SaveImg(unsigned char * pData, int iWidth, int iHeight, string strPath)
{
    BITMAPFILEHEADER targetfileheader;
    BITMAPINFOHEADER targetinfoheader;
    memset(&targetfileheader, 0, sizeof(BITMAPFILEHEADER));
    memset(&targetinfoheader, 0, sizeof(BITMAPINFOHEADER));

    targetfileheader.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);
    targetinfoheader.biSize = iWidth * iHeight + sizeof(RGBQUAD) * 256 + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    targetfileheader.bfReserved1 = 0;
    targetfileheader.bfReserved2 = 0;
    targetfileheader.bfType = 0x4D42;

    targetinfoheader.biBitCount = 8;
    targetinfoheader.biSize = sizeof(BITMAPINFOHEADER);
    targetinfoheader.biHeight = iHeight;
    targetinfoheader.biWidth = iWidth;
    targetinfoheader.biPlanes = 1;
    targetinfoheader.biCompression = 0;
    targetinfoheader.biSizeImage = 0;
    targetinfoheader.biXPelsPerMeter = 0;
    targetinfoheader.biYPelsPerMeter = 0;
    targetinfoheader.biClrImportant = 0;
    targetinfoheader.biClrUsed = 0;

    RGBQUAD rgbquad[256];
    for (int i = 0; i < 256; i++)
    {
        rgbquad[i].rgbBlue = i;
        rgbquad[i].rgbGreen = i;
        rgbquad[i].rgbRed = i;
        rgbquad[i].rgbReserved = 0;
    }


    FILE * fp = fopen(strPath.c_str(), "wb");
    fwrite(&targetfileheader, sizeof(BITMAPFILEHEADER), 1, fp);
    fwrite(&targetinfoheader, sizeof(BITMAPINFOHEADER), 1, fp);
    fwrite(&rgbquad, sizeof(RGBQUAD), 256, fp);

    for (int i = 0; i < iHeight; i++)
    {
        fwrite(pData + (iHeight - 1 - i) * iWidth, iWidth, 1, fp);
    }
    fclose(fp);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章