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

时间:2015-11-09 11:28:32

标签: delphi

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

我想尝试使用FMX CreateThumbnail来查看它的速度:

  

FMX.Graphics.BMP.CreateThumbnail

我在VCL应用程序中创建了一个FMX位图,并尝试为其分配一个“普通”位图。

  

fmxBMP.Assign(vclBMP);

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

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

1 个答案:

答案 0 :(得分:2)

您可以使用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;