快速调整图像大小的方法(混合FMX和VCL代码)



我想快速调整图像大小(缩小/放大)。生成的图像应该是高质量的,所以我不能使用经典的StretchDraw或类似的东西。JanFX和Graphics32库提供高质量的重采样器。质量很高,但速度非常慢(处理2000x1000图像需要几秒钟)。

我想试试FMX CreateThumbnail看看它有多快:

FMX.Graphics.BMP创建缩略图

我在VCL应用程序中创建了一个FMX位图,并试图为其分配一个"正常"位图。

fmxBMP.Assign(vclBMP);

但我得到一个错误:无法将TBitmap分配给TBitmap。显然,这两个位图是不同的。

我的问题:
1.FMX中的图像处理程序是否比正常的VCL程序快得多
2.最重要的是:如何将VCL位图分配给FMX位图(反之亦然)?

您可以使用GDI+缩放。

您可以通过指定GDIPAPI中定义的不同插值、像素偏移和平滑模式来更改结果质量和速度。

uses
  GDIPAPI,
  GDIPOBJ;
procedure ScaleBitmap(Source, Dest: TBitmap; OutWidth, OutHeight: integer);
var
  src, dst: TGPBitmap;
  g: TGPGraphics;
  h: HBITMAP;
begin
  src := TGPBitmap.Create(Source.Handle, 0);
  try
    dst := TGPBitmap.Create(OutWidth, OutHeight);
    try
      g := TGPGraphics.Create(dst);
      try
        g.SetInterpolationMode(InterpolationModeHighQuality);
        g.SetPixelOffsetMode(PixelOffsetModeHighQuality);
        g.SetSmoothingMode(SmoothingModeHighQuality);
        g.DrawImage(src, 0, 0, dst.GetWidth, dst.GetHeight);
      finally
        g.Free;
      end;
      dst.GetHBITMAP(0, h);
      Dest.Handle := h;
    finally
      dst.Free;
    end;
  finally
    src.Free;
  end;
end;

最新更新