在不损失透明度的情况下调整 TWICImage 的大小



如何在不失去透明度的情况下调整TWICImage的大小?我使用参数为TBitmapJclGraphics.Resize()方法。TBitmap.Assign()方法会失去透明度。

在这种情况下,图像的类型为图标。但在另一种情况下,它可能是不同类型的图像。

uses
jclGraphics, ShellApi, UrlMon;

procedure ResizeImageStream(AStream: TMemoryStream; AWidth, AHeight: Integer);
var
WicImage: TWicImage;
Bitmap1: TBitmap;
begin
WicImage := TWicImage.Create;
try
WicImage.LoadFromStream(AStream);
if ((WicImage.Width > 32) or (WicImage.Height > 32)) then begin
Bitmap1 := TBitmap.Create;
try
Bitmap1.Assign(WicImage);
Bitmap1.Transparent := True;
Bitmap1.TransparentColor := clBlack;
Stretch(AWidth, AHeight, rfMitchell, 0, Bitmap1);
WicImage.Assign(Bitmap1);
AStream.Clear;
WicImage.SaveToStream(AStream);
finally
FreeAndNil(Bitmap1);
end;
end;
finally
WicImage.Free;
end;
end;
procedure ResizeImageFile(AFileNameSrc, AFileNameDsc: String; AWidth, AHeight: Integer);
var
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create;
try
Stream.LoadFromFile(AFileNameSrc);
ResizeImageStream(stream, AWidth, AHeight);
if FileExists(AFileNameDsc) then
DeleteFile(AFileNameDsc);
Stream.SaveToFile(AFileNameDsc);
finally
Stream.Free;
end;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
URLDownloadToFile(nil, PChar('https://www.shell.cz/apps/settings/wcm/designs/shell-rio/clientlibs/themes/theme-shell/resources/favicon/favicon.ico'),
PChar('C:pfavicon.ico'), 0, nil);
ResizeImageFile('C:pfavicon.ico', 'C:pfavicon_32.ico', 32, 32);
end;

WIC API 具有自己的内置大小调整功能,根本不需要将TWICImage转换为TBitmap。例如:

var
WicImage: TWICImage;
Scale: IWICBitmapScaler;
WicBitmap: IWICBitmap;
begin
WicImage := TWICImage.Create;
try
WicImage.LoadFromStream(Stream);
OleCheck(WicImage.ImagingFactory.CreateBitmapScaler(Scale));
OleCheck(Scale.Initialize(WicImage.Handle, 32, 32, WICBitmapInterpolationModeFant));
OleCheck(WicImage.ImagingFactory.CreateBitmapFromSourceRect(Scale, 0, 0, 32, 32, WicBitmap));
WicImage.Handle := WicBitmap;
Stream.Clear;
WicImage.SaveToStream(Stream);
finally
WicImage.Free;
end;
end;

最新更新