android - 如何在delphi firemonkey和android上使用抗锯齿

标签 android delphi canvas firemonkey antialiasing

我使用firemonkey开发delphi xe7,并在android上进行测试。

当我在正常分辨率为1(scene.scale = 1)的设备上工作时,TRoundRect,TPie等组件会产生难看的结果,因为它们没有抗锯齿(或者人眼看不到抗锯齿) )。如果我在高清设备上工作(例如,scene.scale = 2),那么这并不是一个大问题,因为高清可以解决这个问题。



因此,第一个问题是,他们是否有办法使这些部件产生抗锯齿图形?
还如何直接在画布上绘制抗锯齿的Disque(带有图像)?



现在,当我在位图和画布上工作时,我注意到FillText会产生抗锯齿结果。在某种程度上,这对我以前想要的(用于弥补)是有好处的,但是对于文本来说却有点麻烦,因为这会使它们“模糊”。
更糟糕的是,当我先执行Mybitmap.canvas.FillText =>产生一些抗锯齿,然后再执行MyPaintBox.canvas.DrawBitmap(MyBitmap)时,它将再次添加更多的抗锯齿!最后的文字会很模糊:(对我来说这听起来很疯狂
在没有srcRec和destRect中任何扭曲的情况下执行canvas.drawBitmap不会将确切的像素从位图复制到画布:(

所以这是他们的一种方法:

无需任何抗锯齿功能即可调用canvas.FillText或配置抗锯齿级别。
完全不使用任何抗锯齿调用c anvas.DrawBitmap!从位图到画布的像素完美复制

预先感谢您的帮助!



我今天发现的一些解决方案(及其问题):

我找到了一种使用抗锯齿方法制作所有可视控件(troundrect等)的方法:将Tform.quality设置为highQuality!

但是现在我面临着一个我无法理解的非常强烈的问题:(
也许是delphi中的错误,所以如果有人可以看的话,我将非常感谢他...

当您需要画布用于表单创建时

构造函数TCanvasGpu.CreateFromWindow(... AQuality:TCanvasQuality)

这里的质量来自MyForm.quality

现在问题出在TBITMAP :(和以前一样,当我们需要画布来通过它创建位图时

构造函数TCanvasGpu.CreateFromBitmap(.... AQuality:TCanvasQuality = TCanvasQuality.SystemDefault)

但是这里的问题是在设置画布质量的位图中根本没有属性:(

所以我尝试这个解决方案:

        aBitmap := Tbitmap.Create(w,h);
        try

          aCanvas := TCanvasManager.CreateFromBitmap(ABitmap, TCanvasQuality.HighQuality);
          Try

            aCanvas.BeginScene;
            try
              aCanvas.Fill.Kind := TbrushKind.solid;
              acanvas.Fill.Color := $ff000000;
              aCanvas.FillRect(TRectF.Create(0, 0, w, h), w / 2,  h / 2, ALLcorners, 1);

            finally
              aCanvas.EndScene;
            end;

          Finally
            aCanvas.Free;
          End;
          ....


我想我现在可以在位图上获得与直接在表单画布上绘制时一样的抗锯齿效果吗?绝对不会,什么都不会改变,而且在没有任何抗锯齿的情况下我仍然很难看:(

我想念什么??



编辑:

我现在发现删除抗锯齿的唯一选择是将位图放大2倍,然后再降低2倍!疯狂的:(但是减少的算法删除了别名...但所有这些的代价是速度变慢,特别是当我们知道所有图形功能必须在主线程中完成时:(


现在,我想更多的是对自己说,拥有一个不支持多线程的图形库真是太疯狂了!我不敢相信这是openGL的要求,现在我越来越认为这是delphi中的错误或错误概念:(
说到上一点,即使openGL确实要求所有图形例程都必须在主线程中完成(但我真的很怀疑),我不明白为什么delphi无法在android上不提供另一个支持多线程的TcanvasClass(TcanvasGPU除外) !更疯狂的是,当您在Tbitmap上使用TCanvasGPU时,在任何情况下(如您在我之前的文章中所见),结果都将与在可视组件上使用TCanvasGPU的结果有所不同!
现在我正在寻找直接在像素网格上工作的功能(旧式),这使我可以在多线程中工作。但不幸的是,它们与firemonley / android不太兼容:(
完成这是我用来绘制位图的功能。但是由于必须在主线程中调用此函数,因此它会减慢我的应用程序的速度(尤其是滚动)……因此,如果您有任何想法可以使此程序更快或更快速,请采取:)

function DrawAdvertBitmap: Tbitmap;
var aBitmapAliased: Tbitmap;
begin

  aBitmapAliased := Tbitmap.Create(trunc(FWidth * fScreenScale) * 2, trunc(FHeight * fScreenScale) * 2);

  try

    aBitmapAliased.Canvas.BeginScene;
    try

      aBitmapAliased.canvas.Clear(0);
      aBitmapAliased.canvas.Fill.Color := $ff000000;
      aBitmapAliased.Canvas.Fill.Kind := TbrushKind.Solid;
      aBitmapAliased.Canvas.FillRect(...);

      aBitmapAliased.Canvas.Fill.Color := $ff333844;
      aBitmapAliased.Canvas.Font.Family := 'Roboto-Bold';
      aBitmapAliased.Canvas.Font.Size := 12 * fScreenScale * 2;
      aBitmapAliased.Canvas.Font.Style := [TFontStyle.fsBold];
      aBitmapAliased.Canvas.FillText(...);

    finally
      aBitmapAliased.Canvas.EndScene;
    end;

    //reduce by 2 to make antialiased
    result := Tbitmap.Create(trunc(FWidth * fScreenScale), trunc(FHeight * fScreenScale));

    try

      result.Canvas.BeginScene;
      try

        result.Canvas.Clear(0);
        result.Canvas.DrawBitmap(aBitmapAliased,...);

      finally
        result.Canvas.EndScene;
      end;

    except
      result.Free;
      raise;
    end;

    result.BitmapScale := fScreenScale;

  finally
    aBitmapAliased.free;
  end;

end; 

最佳答案

如果我们谈论Firemonkey:


TImage具有属性“ DisableInterpolation:boolean”
TForm具有“ Quality:TCanvasQuality =(SystemDefault,HighPerformance,HighQuality)”属性-在设计时有效


重要提示:


抗锯齿是一项非常昂贵的操作,默认情况下在移动平台上禁用此功能。
该设备应支持相同的抗锯齿功能。要支持多重采样,OpenGL必须具有GL_EXT_multisampled_render_to_texture属性。如果设备硬件不支持多重采样,则不会支持AA。

关于android - 如何在delphi firemonkey和android上使用抗锯齿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34312322/

相关文章:

iphone - 在 iPhone 和 Android 上生成二维条码(例如 QR 码、数据矩阵、PDF417)

android - react-native-fbsdk - 在 android 上分享照片错误

multithreading - 使用 OmniThreadLibrary 并行写入数组比串行写入慢

delphi - Facebook 墙上

Javascript ChartJS 永久更新图表和 Canvas

android - 带有线性直线进度条的 ListView

android - 如何用动画改变 NumberPicker 的值?

delphi - TCP客户端 : Custom timeout time

canvas - Kivy-如何使我的 Canvas 高度小于父级高度

javascript - 你能用 HTML5 <canvas> 做等距透视吗?