保存的Gdiplus :: Bitmap总是有Alpha通道(RGBA / ARGB)

时间:2018-06-11 12:58:39

标签: c++ bitmap png gdi+ pixelformat

我有一个PixelFormat32bppARGB格式的Gdiplus :: Bitmap(在C ++中)并使用以下方法将其转换为PixelFormat32bppRGB:

        Gdiplus::Bitmap* bitmapRGB = new Gdiplus::Bitmap(bitmap->GetWidth(), bitmap->GetHeight(), PixelFormat32bppRGB);
        Gdiplus::Graphics graphics(bitmapRGB);
        graphics.DrawImage(bitmap, Gdiplus::Point(0, 0));

如果我检查RGB-Bitmap的格式是否正确(RGB):

bitmapRGB ->GetPixelFormat() == PixelFormat32bppRGB

如果我保存位图并检查其格式(即使用Gimp),则有第四个通道。

    CLSID pngClsid;
    GetEncoderClsid(L"image/png", &pngClsid);
    bitmapRGB ->Save(path, &pngClsid, NULL);

如何使用RGB-Pixelformat获得png?

1 个答案:

答案 0 :(得分:1)

PixelFormat32bppRGB仍为32位。 24位格式需要PixelFormat24bppRGB

Gdiplus::Bitmap* bitmapRGB = new Gdiplus::Bitmap(
    bitmap->GetWidth(), bitmap->GetHeight(), PixelFormat24bppRGB);

不需要new运算符,使用适当的构造函数之一来确保没有内存泄漏:

//convert:
Gdiplus::Bitmap bitmap(L"source.jpg");
Gdiplus::Bitmap bitmapRGB(bitmap.GetWidth(), bitmap.GetHeight(), PixelFormat24bppRGB);

Gdiplus::Graphics graphics(&bitmapRGB);
graphics.DrawImage(&bitmap, Gdiplus::Point(0, 0));

CLSID pngClsid;
GetEncoderClsid(L"image/png", &pngClsid);
bitmapRGB.Save(L"destination.png", &pngClsid);