使用TImage时Android下的低质量delphi用户界面设计

时间:2018-10-25 12:13:52

标签: android delphi image-processing firemonkey

由于Android手机以多种不同的屏幕分辨率发布,并且我的用户界面使用多个TImage组件进行了“蒙皮”处理,因此我遇到了一个主要的开发问题,我必须相对于设备的屏幕分辨率缩放每个图像。 / p>

由于某种我无法理解的原因,在Android下,使用非常低质量的缩放器(可能是最近邻居)对TImage进行插值,导致图像显示的质量非常低(即使将屏幕缩放比例考虑在内,也会发生这种情况)考虑因素,并且表格的质量很高)。

由于此,这意味着我可以预先缩放并包括同一张图像的多个不同分辨率,希望它看起来“足够接近”(并膨胀我的应用程序),或者我可以使用软件算法来缩放实时图像,然后缓存结果以供以后运行。

我使用软件三次缩放器选择了第二个选项,但是问题是我的应用程序具有大量图像资源,第一次在高端移动设备上加载可能需要18秒。

我知道使用OpenGL在硬件中可能需要做的事情,但是我还没有找到一个清晰明了的例子来说明如何在Android的Delphi中做到这一点。即使无需重新编码整个OpenGL UI也可以做到。

我是否缺少一些明智的设计方法? 我唯一的机会是从Embarcadero那里解决问题吗?

1 个答案:

答案 0 :(得分:1)

我花了一些时间来解决这个问题,但这是Android本机代码,它将以比我能找到和优化的任何纯软件解决方案快得多的速度高质量缩放图像。

uses Androidapi.JNI.Media, Androidapi.JNI.GraphicsContentViewText, Androidapi.JNIBridge, FMX.Surfaces, FMX.Helpers.Android;

procedure AndroidResizeBitmap(srcBitmap,dstBitmap : TBitmap);
var
  sJBitmap     : JBitmap;
  ScaledBitmap : JBitmap;
  sSurface     : TBitmapSurface;
begin
  sSurface     := TBitmapSurface.Create;
  sSurface.Assign(srcBitmap);
  sJBitmap     := TJBitmap.JavaClass.createBitmap(sSurface.Width,   sSurface.Height,TJBitmap_Config.JavaClass.ARGB_8888);
  SurfaceToJBitmap(sSurface, sJBitmap);
  ScaledBitmap := TJBitmap.JavaClass.createScaledBitmap(sJBitmap,   dstBitmap.Width, dstBitmap.Height, True);
  sJBitmap     := nil;
  JBitmapToSurface(ScaledBitmap,sSurface);
  ScaledBitmap := nil;
  dstBitmap.Assign(sSurface);
  sSurface.Free;
  sSurface     := nil;
end;