Сохраненный Gdiplus :: Растровое изображение всегда имеет альфа-канал (RGBA / ARGB) - PullRequest
0 голосов
/ 11 июня 2018

У меня есть Gdiplus :: Bitmap (на C ++) в формате PixelFormat32bppARGB и я конвертирую его в 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);

Как мне получить png с RGB-Pixelformat

1 Ответ

0 голосов
/ 11 июня 2018

PixelFormat32bppRGB по-прежнему 32-разрядный.PixelFormat24bppRGB требуется для 24-битного формата:

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);
...