使用GPU画布和TCanvas.DrawBitmap时低质量的缩小插值

时间:2018-07-03 15:01:26

标签: delphi firemonkey

在将Delphi设置为使用GPU画布(FMX.Types.GlobalUseGPUCanvas:= True)时,在Windows和android下,调用TCanvas.DrawBitmap时似乎没有执行高质量的低比例插值,而是结果看起来像是像素化(最近的邻居缩放器?)。

查看源代码(FMX.Canvas.GPU.pas / DoDrawBitmap),从不使用“ HighSpeed”参数。

使用TCanvas.DrawBitmap:
Using TCanvas.DrawBitmap

使用基于软件的双三次缩放器(慢得多):
Using a software bicubic scaler

人们会认为,使用GPU可以访问便宜的(高质量的CPU使用)缩放器,但事实并非如此。

是否可以使用Delphi(或至少在Android下为Delphi)访问高质量的跨平台硬件缩放器?

编辑:
在这些屏幕截图中,表单的“质量”属性设置为“高品质”。

2 个答案:

答案 0 :(得分:0)

是的,从未使用过HighSpeed,但这并不意味着它们不是插值。在GPU上,插值是通过Form.quality(高性能/高质量)

进行的

答案 1 :(得分:0)

  1. GlobalUseGPUCanvas:=在桌面上为True始终绘制不带AA的所有控件。因此,请勿在桌面上使用它。在Android / iOS上,这是默认方法。

  2. 如果不使用GlobalUseGPUCanvas,但仍然没有AA。那是因为缩放-屏幕当前的全局缩放值。 如果比例为3,则应在Photoshop中以3倍的比例准备图像(分辨率提高3倍,并且图像将变得平滑)。

如果您在运行时使用画布绘制图像(例如图表),则此代码:

if Scene <> nil then
  lScale := Scene.GetSceneScale
else
  lScale := 1;

fBitmap.BitmapScale := lScale;

fBitmap.SetSize(Ceil(Width * lScale), Ceil(Height * lScale) );

要查看设备上的实际图像大小,请将TImage.Wrapmode设置为Original。

P.s。顺便说一句,如果您需要在Android / iOS上使用抗锯齿来绘制线,圆等图元,请使用this本机绘制解决方案(在Android / iOS上,FMX绘制不带AA的图元(顺便说一下,这不适用于图像,所有图像在所有平台上都使用AA。