1

我有一个 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 位图的格式,它是正确的(RGB):

bitmapRGB ->GetPixelFormat() == PixelFormat32bppRGB

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

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

如何获得具有 RGB 像素格式的 png?

4

1 回答 1

1

PixelFormat32bppRGB仍然是32位。PixelFormat24bppRGB24 位格式需要:

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);
于 2018-06-11T18:10:19.367 回答