Низкокачественный дизайн пользовательского интерфейса delphi под Android при использовании TImage - PullRequest
0 голосов
/ 25 октября 2018

Поскольку телефоны Android выпускаются с различными разрешениями экрана, а мой пользовательский интерфейс «обложен» с использованием нескольких компонентов TImage, я столкнулся с серьезной проблемой при разработке, поэтому я должен масштабировать каждое из моих изображений относительно разрешения экрана устройства.

По какой-то причине, которую я не могу понять, в Android TImage интерполируется с использованием скейлера действительно низкого качества (возможно, ближайшего соседа), что приводит к отображению изображения очень низкого качества (это происходит, даже если масштаб экранапринимается во внимание, и качество формы устанавливается на высоком уровне).

Из-за этого это означает, что я могу предварительно масштабировать и включать несколько разных разрешений одного и того же изображения, надеясь, что оно будет выглядеть «достаточно близко».(и вздутие живота моего приложения), или я могу использовать программный алгоритм для масштабирования изображений в реальном времени, а затем кэшировать результат для последующих запусков.

Я выбираю второй вариант, используя программный бикубический скейлер, нопроблема в том, что мое приложение имеет так много ресурсов изображения, оно может18 секунд, чтобы загрузить первый раз на мобильное устройство высокого класса.

Я знаю, что возможно сделать то, что мне нужно в аппаратном обеспечении, используя OpenGL, но я не смог найти четкого/ чистый пример того, как это можно сделать в Delphi для Android.И даже если это можно сделать без перекодировки всего пользовательского интерфейса для OpenGL.

Есть ли что-то, чего мне не хватает в дизайне?Является ли решение от Embarcadero моим единственным шансом?

1 Ответ

0 голосов
/ 07 ноября 2018

Мне потребовалось некоторое время, чтобы заблокировать это, но вот собственный код 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;
...