Изменение размера TWICImage без потери прозрачности - PullRequest
0 голосов
/ 26 сентября 2019

Как изменить размер 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;

1 Ответ

0 голосов
/ 26 сентября 2019

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...