Инициализация может быть сделана с помощью Rectangle
или FillRect
(для этого, вероятно, предпочтительнее будет FillRect
- Rectangle
рисует контур прямоугольника в текущем цвете пера, который мы, вероятно, не хотим ).
Итак, последовательность выглядит примерно так:
CImage png;
png.Load(pDoc->filename);
CRect rect{ 0, 0, png.GetWidth(), png.GetHeight() };
CImage jpeg;
jpeg.Create(rect.Width(), rect.Height(), png.GetBPP());
auto dc = jpeg.GetDC();
HBRUSH white = CreateSolidBrush(RGB(255, 255, 255));
FillRect(dc, &rect, white);
png.Draw(dc, 0, 0);
jpeg.ReleaseDC();
jpeg.Save(L"Insert File name here", Gdiplus::ImageFormatJPEG);
jpeg.Destroy();
jpeg.ReleaseGDIPlus();
png.ReleaseGDIPlus();
GDI + достаточно «умный», поэтому, когда вы делаете .Draw
с изображением, имеющим альфа-канал, он учитывает этот канал без необходимости использования TransparentBlt
(или чего-либо подобного).
SetTransparentColor
будет не работать на то, что вы пытаетесь сделать здесь. SetTransparentColor
для изображения, которое не имеет альфа-канал («слой прозрачности»). Затем вы используете его, чтобы выбрать цвет, который будет обрабатываться так, как если бы он был прозрачным, что, безусловно, может быть полезным, но не совсем того, что вам нужно.
Вместо этого вы можете использовать memset
, но только для цветов, где красный, зеленый и синий каналы имеют одинаковые значения (то есть черный, белый или некоторый оттенок серого). В противном случае вы можете выполнить заполнение самостоятельно с помощью вложенного цикла, но в большинстве случаев вы, вероятно, захотите использовать вместо него FillRect
(он может использовать графическое оборудование для ускорения, где цикл будет довольно надежно работать только на Процессор - наихудший случай, они имеют примерно одинаковую скорость, но в некоторых случаях FillRect
будет быстрее).