Мне нужна небольшая помощь...
У меня есть прозрачное изображение PNG в ресурсах моего приложения. До сих пор я загружал его в TPngImage
и рисовал на экране с помощью Canvas.Draw(X, Y, PngImage);
. И нарисовано прозрачно. Теперь я обновил свое приложение до DpiAware, и мне нужно масштабировать все изображения. Мне нужен качественный ресемплер, и я решил использовать Graphics32. Мне удалось сделать повторную выборку, но я не знаю, как сохранить прозрачность... Я пробую все, что могу придумать... Результатом следующего кода является изображение, нарисованное черным цветом в прозрачной области.. .
Foto32, Buff: TBitmap32;
FotoPng: TPngImage;
constructor TForm.Create(AOwner: TComponent);
const BkgHeight = 380;
var Res: TKernelResampler;
SRect, DRect: TRect;
ImgWidth: Integer;
begin
inherited;
Buff:= TBitmap32.Create;
Res:= TKernelResampler.Create;
Res.Kernel:= TLanczosKernel.Create;
FotoPng:= TPngImage.Create;
FotoPng.Transparent:= True;
FotoPng.TransparentColor:= clBlack;
FotoPng.LoadFromResourceName(HInstance, 'BKG_FOTO');
Foto32:= TBitmap32.Create;
Foto32.DrawMode:= dmBlend;
Foto32.CombineMode:= cmMerge;
Foto32.OuterColor:= clBlack;
Foto32.Canvas.Brush.Style:= bsClear;
Foto32.SetSize(FotoPng.Width, FotoPng.Height);
FotoPng.Draw(Foto32.Canvas, Rect(0, 0, FotoPng.Width, FotoPng.Height));
ImgWidth:= Round(Real(Foto32.Width / Foto32.Height) * BkgHeight);
SRect:= Rect(0, 0, Foto32.Width, Foto32.Height);
Buff.DrawMode:= dmBlend;
Buff.CombineMode:= cmMerge;
Buff.OuterColor:= clBlack;
Buff.Canvas.Brush.Style:= bsClear;
Buff.SetSize(Scale(ImgWidth), Scale(BkgHeight));
DRect:= Rect(0, 0, Buff.Width, Buff.Height);
Res.Resample(Buff, DRect, DRect, Foto32, SRect, dmTransparent {dmBlend}, nil);
end;
procedure TForm.Paint;
begin
// ....
Buff.DrawTo(Canvas.Handle, X, Y);
end;
А это мое прозрачное PNG-изображение, скомпилированное в ресурсы: https://postimg.cc/3yy3wrJB
Я нашел здесь похожий вопрос, но я не использую изображение с TImage
я рисую прямо на холсте. И в единственном ответе Дэвид говорит:
В любом случае, если это так, я бы объединил поддержку прозрачности TImage с возможностью повторной выборки TBitmap32, чтобы построить решение таким образом. Сохраните исходное изображение в экземпляре TBitmap32. Всякий раз, когда вам нужно загрузить его в компонент TImage, например, при изменении размера, используйте TBitmap32, чтобы выполнить изменение размера в памяти и загрузить это изображение с измененным размером.
Это именно то, что я пытаюсь сделать, но я не знаю, почему прозрачность не работает. Любые идеи ?
FotoPng.Draw(Foto32.Canvas, ...
-> Как только вы нарисуете png, все кончено. Вы можете рисовать прозрачно, но информация о прозрачности при этом теряется, рисование не передает альфа-канал в цель. Вам нужно передискретизировать сам png. См. здесь. - person Sertac Akyuz   schedule 29.01.2020pngquant
в обычный png в памяти? - person Marus Nebunu   schedule 30.01.2020COLOR_PALETTE
(индексированный pngquant) наCOLOR_RGBALPHA
. Я думаю, что это должно быть возможно, но я не очень хорошо разбираюсь в графике в Delphi.... - person Marus Nebunu   schedule 30.01.2020Download original image
- person Marus Nebunu   schedule 31.01.2020