从内存中的BITMAP写入PNG时出现图形错误

时间:2019-03-12 13:36:21

标签: c++ bitmap rgb libpng

我正在使用libpng将BITMAP转换为PNG(全部在内存中),它的确创建了图像,但存在一些视觉错误。

enter image description here

背景上有一条垂直的彩色线,看起来是青色,洋红色和黄色,并且图像水平散开,因此右侧缺少1/4。 BITMAP 是使用 CDC 创建的,并绘制到CBitmap上。绘制是在 RGB 中完成的,因此当将 BITMAP 传递给 PNG 函数时,我将 BITMAPINFOHEADER 与{{1 }}设置为biCompression。在libpng设置中,我使用8表示位深度,使用BI_RGB。我最初以为 BITMAP 位于 CMYK 中,这是导致问题的原因,但似乎位于 RGB 中。会有转换问题吗?当我将相同的位图转换为 JPEG 时,一切都完美了。

BITMAPINFOHEADER

PNG_COLOR_TYPE_RGB

我正在使用 BYTE 数组:

BITMAPINFOHEADER oBitmapInfoHeader;
memset(&oBitmapInfoHeader, 0, sizeof(BITMAPINFOHEADER));
oBitmapInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
oBitmapInfoHeader.biWidth = width;
oBitmapInfoHeader.biHeight = height * -1;
oBitmapInfoHeader.biPlanes = 1;
oBitmapInfoHeader.biBitCount = bitmap.bmPlanes * bitmap.bmBitsPixel; //initializes at 32
oBitmapInfoHeader.biCompression = BI_RGB;
oBitmapInfoHeader.biSizeImage = 0;
oBitmapInfoHeader.biXPelsPerMeter = 0;
oBitmapInfoHeader.biYPelsPerMeter = 0;
oBitmapInfoHeader.biClrUsed = 0;
oBitmapInfoHeader.biClrImportant = 0;

1 个答案:

答案 0 :(得分:0)

我知道了:

biBitCount确实是24

oBitmapInfoHeader.biBitCount = 24;// bitmap.bmPlanes * bitmap.bmBitsPixel;

GetDIBits因开始太远而失败

(LPBYTE)poBitmapInfoHeader + (oBitmapInfoHeader.biSize + iColors * 3),//sizeof(RGBQUAD)),   // address for bitmap bits

然后以3bpp的步幅大步前进

const uint32_t stride = (width * 3);