Существуют версии PngImage (Portable Network Graphics Delphi)
Это позволяет сделать это с помощью простого StretchDraw.
У меня есть версия, которая позволяет это делать - 1.564 (31 июля 2006 г.)
И версия, которая не позволяет - 1.4361 (8 марта 2003 г.)
Для этого я использовал:
heart.png - с прозрачностью, и мне удалось изменить ее размер и сохранить с прозрачностью.
empty.png - чистый прозрачный png. это использовалось как чистый лист, чтобы поместить мое изображение на этом.
Я проверил это с помощью такого кода:
procedure TForm1.Button1Click(Sender: TObject);
var pic_empty, pic_stamp, pic_result :TPicture;
r:TRect;
png : TPNGObject;
begin
pic_stamp := TPicture.Create;
pic_stamp.LoadFromFile('c:\heart.png');
pic_stamp.Graphic.Transparent := True;
pic_empty := TPicture.Create;
pic_empty.LoadFromFile('c:\empty.png');
pic_empty.Graphic.Transparent := True;
r.Left := 0;
r.Top := 0;
r.Right := r.Left + 100;
r.Bottom := r.Top + 100;
pic_result := tpicture.Create;
pic_result.Bitmap.Assign(pic_empty.Graphic);
pic_result.Graphic.Transparent := True;
pic_result.Bitmap.Canvas.StretchDraw(r,pic_stamp.Graphic);
pic_result.Bitmap.Width :=100;
pic_result.Bitmap.Height:=100;
png := TPNGObject.Create;
png.Assign(pic_result.Bitmap);
png.SaveToFile('c:\result.png');
png.Free;
pic_result.Free;
pic_empty.Free;
pic_stamp.free;
end;
Delphi-7, win7 x64