【问题标题】:Resize TWICImage without losing transparency在不丢失透明度的情况下调整 TWICImage 的大小
【发布时间】:2019-09-26 07:40:41
【问题描述】:

如何在不丢失透明度的情况下调整TWICImage 的大小?我使用JclGraphics.Resize() 方法,其参数是TBitmap。在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:\p\favicon.ico'), 0, nil);
  ResizeImageFile('C:\p\favicon.ico', 'C:\p\favicon_32.ico', 32, 32);
end;

【问题讨论】:

    标签: image delphi resize stretch


    【解决方案1】:

    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;
    

    【讨论】:

    • 看起来不错。不幸的是,当我调用 WicImage.SaveToStream 时,我收到了访问冲突。
    猜你喜欢
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 2016-08-10
    • 1970-01-01
    相关资源
    最近更新 更多