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

У меня есть 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

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]