为了在图像格式之间进行转换,最简单的方法是使用由MFC和ATL共享并在头文件 atlimage.h 中定义的CImage类。
CImage image;
HRESULT res = image.Load("in.bmp");
image.Save("out.jpg");
image.Save("out.gif");
image.Save("out.png");
image.Save("out.tif");
如果您有一个 RGB 缓冲区并想创建一个位图:只需创建一个位图头并将其保存到文件中,然后将 RGB 缓冲区添加到其中。
要创建头文件,您可以使用头文件 WinGDI.h 中定义的GDI中的BITMAPFILEHEADER、BITMAPINFOHEADER和RGBQUAD结构
以下是有关如何填充标题数据的示例:
BITMAPINFOHEADER bmpInfoHdr;
bmpInfoHdr.biSize = sizeof(BITMAPINFOHEADER);
bmpInfoHdr.biHeight = nHeight;
bmpInfoHdr.biWidth = nWidthPadded;
bmpInfoHdr.biPlanes = 1;
bmpInfoHdr.biBitCount = bitsPerPixel;
bmpInfoHdr.biSizeImage = nHeight * nWidthPadded * nSPP;
bmpInfoHdr.biCompression = BI_RGB;
bmpInfoHdr.biClrImportant = 0;
bmpInfoHdr.biClrUsed = 0;
bmpInfoHdr.biXPelsPerMeter = 0;
bmpInfoHdr.biYPelsPerMeter = 0;
bmpFileHdr.bfType = BITMAP_FORMAT_BMP;
bmpFileHdr.bfSize = (DWORD) (sizeof(BITMAPFILEHEADER) + bmpInfoHdr.biSize +
sizeof(RGBQUAD)*numColors + bmpInfoHdr.biSizeImage);
bmpFileHdr.bfReserved1 = 0;
bmpFileHdr.bfReserved2 = 0;
bmpFileHdr.bfOffBits = (DWORD) (sizeof(BITMAPFILEHEADER) + bmpInfoHdr.biSize +
sizeof(RGBQUAD)*numColors);
请注意,位图是倒置存储的,并且图像的宽度必须在 DWORD 上对齐,RLE 压缩的位图除外。(它们必须是 4 字节的倍数,如有必要,请添加填充)。
if ((nWidth%4) != 0)
nPadding = ((nWidth/4) + 1) * 4;
保存缓冲区时,将所需的填充添加到每一行...
总而言之,这些是从 rgb 缓冲区创建位图文件所需的步骤:
//1. create bmp header
//2. save header to file:
write(file, &bmpFileHdr, sizeof(BITMAPFILEHEADER));
write(file, &bmpInfoHdr, sizeof(BITMAPINFOHEADER));
write(file, &colorTable, numColors * sizeof(RGBQUAD));
//3. add rgb buffer to file:
for(int h=0; h<nHeight; h++) {
for(int w=0; w<nWidth; w++) {
//3.a) add row to file
//3.b) add padding for this row to file
}
}