dmi*_*ous 5 c++ png jpeg bitmap libpng
我有 bytearray,其中每三个字节描述 1 个像素(RGB)。任务是将其转换为 jpeg 或 png。
实际上,我正在使用 Zint(用于生成条形码的开源库),它使用 libpng 生成图像文件并将其保存到文件系统,但在 Zint 函数 png_plot() 中,除了生成图像外,还将其保存在磁盘上,这是不可取的。
因此,我认为有两种方法:
1. 从位图
字节数组到 bmp -> jpeg / png(使用其他一些库)2. 编写钩子或一些类似于 png_plot()
你能给我一些建议吗?谢谢你。
更新:对于@peacemaker
FILE *f;
zint_symbol *my_symbol;
my_symbol = ZBarcode_Create();
ZBarcode_Encode_and_Buffer(my_symbol, (unsigned char *)argv[1], 0, 0);
f = fopen("bitmap.bmp", "w");
fwrite(my_symbol->bitmap, sizeof(*(my_symbol->bitmap)), my_symbol->bitmap_height * my_symbol->bitmap_width, f);
ZBarcode_Delete(my_symbol);
fclose(f);
Run Code Online (Sandbox Code Playgroud)
为了在图像格式之间进行转换,最简单的方法是使用MFC和ATL共享的类CImage,并在头文件 atlimage.h 中定义。
CImage image;
HRESULT res = image.Load("in.bmp");
image.Save("out.jpg");
image.Save("out.gif");
image.Save("out.png");
image.Save("out.tif");
Run Code Online (Sandbox Code Playgroud)
如果您有 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);
Run Code Online (Sandbox Code Playgroud)
请注意,位图存储颠倒,并且图像的宽度必须在 DWORD 上对齐,RLE 压缩位图除外。(它们必须是 4 字节的倍数,必要时添加填充)。
if ((nWidth%4) != 0)
nPadding = ((nWidth/4) + 1) * 4;
Run Code Online (Sandbox Code Playgroud)
保存缓冲区时,为每行添加所需的填充...
总而言之,以下是从 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
}
}
Run Code Online (Sandbox Code Playgroud)