【发布时间】:2019-01-04 10:23:12
【问题描述】:
在 C++ 中,我想用 Gdiplus 创建一个简单的透明图像并将其保存为 png。我有以下代码:
// These variables are class members and got initialized and are used elsewhere
BITMAPINFO bmi;
HDC hdc;
void* pvBits;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = some_width;
bmi.bmiHeader.biHeight = some_height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 32;
bmi.bmiHeader.biCompression = BI_RGB;
bmi.bmiHeader.biSizeImage = ((((bmi.bmiHeader.biWidth * bmi.bmiHeader.biBitCount) + 31) & ~31) >> 3) * bmi.bmiHeader.biHeight;
HBITMAP hBM = CreateDIBSection(hDC, &bmi, DIB_RGB_COLORS, &pvBits, NULL, 0x0);
FillMemory(pvBits, bmi.bmiHeader.biSizeImage, 255);
HGDIOBJ oldObj = SelectObject(hDC, hBM);
ReleaseDC(NULL, hDC);
GdiFlush();
GdiPlusBitmap* bitmap = new Gdiplus::Bitmap(&bmi, pvBits);
当我将图像保存为 png 时,我可以看到有一个 alpha 通道,但它设置为 0,所以没有任何透明(RGB 全部设置)。我也尝试将 255 更改为 0,但这只会给我一个黑色的图像,没有蒸腾作用。为什么Fillmemory 调用没有填充 alpha 通道,还是我错过了其他东西?
【问题讨论】:
-
您在哪里/如何编写 PNG?你能分享它创建的PNG吗?您是否尝试过查看您尝试使用调试器填充的内存?
-
我们看不到您是如何保存位图的。一个非常常见的错误是使用错误的编码但正确的文件扩展名保存文件。这不会混淆其他程序,它们会查看文件头而不是扩展名。
-
为什么首先创建一个 DIB 部分,而不是从头开始创建 constructing 和
Gdiplus::Bitmap,指定所需的 PixelFormat? -
@zett42 是旧代码,hdc、bmi等都是代码中用到的成员变量,我试着缩短了。
-
保存 png 工作正常,当我从头开始创建位图并指定正确的像素格式时,我可以在保存的 png 中看到透明度。