AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
Thema durchsuchen
Ansicht
Themen-Optionen

DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

Ein Thema von milos · begonnen am 23. Mai 2016 · letzter Beitrag vom 9. Jun 2016
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#1

DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 23. Mai 2016, 16:22
Hi,

ich würde gerne ein Bitmap mittels Delphi-Referenz durchsuchenTCanvas.DrawBitmap zeichnen.
Komischerweise wird mir hier das Bild trotz HighSpeed = true das Bild auf Android oder allgemein mit dem GPU Canvas nicht Pixelated ausgegeben obwohl ich das gerne hätte. Auf Windows funktioniert das Problemlos mit dem Standardcanvas, schalte ich jedoch Delphi-Referenz durchsuchenFMX.Types.GlobalUseGPUCanvas auf true funktioniert es auch auf Windows wie auf Android auch nicht.
Die Suche auf Google hat nur ergeben das ich den HighSpeed parameter auf true setzen muss jedoch hab ich das ja schon und es klappt nicht... Auch nicht wenn ich Delphi-Referenz durchsuchenTForm.Quality auf Performance setze :/
Hat da jemand einen Umweg wie das trotzdem geht?

Im Anhang ist noch ein Bild welches den Unterschied zeigt.

Freundliche Grüsse
Miniaturansicht angehängter Grafiken
r.jpg  
Milos
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 23. Mai 2016, 17:36
TCanvas ist unter Firemonkey ja nur eine Abstraktion.

Je nach Plattform und Einstellung wird dann eine konkrete Implementierung eingesetzt:
FMX.Canvas.D2D.TCanvasD2D für Windows mit Direct2D 1.0 Technologie, Android wird wohl den FMX.Canvas.GPU.TCanvasGpu bekommen. Daneben gibt es noch GDI+ in FMX.Canvas.GDIP.TCanvasGdiPlus und für Apple-Kram den FMX.Canvas.Mac.TCanvasQuartz.

Wenn du mal in die jeweilige Implementierung der verschiedenen Canvas-Klassen reinschaust, wirst du sehen, dass nur beim GPU-Canvas die Einstellung für HighSpeed ins Leere läuft und damit keine Auswirkung hat.


Delphi-Quellcode:
procedure TCanvasD2D.DoDrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single;
  const HighSpeed: Boolean);
var
  SR, DR: TD2D1RectF;
  IntMode: TD2D1BitmapInterpolationMode;
  B: ID2D1Bitmap;
begin
  if FTarget <> nil then
  begin
    SR := D2Rect(SrcRect);
    DR := D2Rect(DstRect);

    if ABitmap.HandleAllocated then
    begin
      if HighSpeed then
        IntMode := D2D1_BITMAP_INTERPOLATION_MODE_NEAREST_NEIGHBOR
      else
        IntMode := D2D1_BITMAP_INTERPOLATION_MODE_LINEAR;

      B := TD2DBitmapHandle(ABitmap.Handle).CreateBitmap(FTarget);
      if B <> nil then
        FTarget.DrawBitmap(B, @DR, AOpacity, IntMode, @SR);
    end;
  end;
end;
Delphi-Quellcode:
procedure TCanvasGpu.DoDrawBitmap(const ABitmap: TBitmap; const SrcRect, DstRect: TRectF; const AOpacity: Single;
  const HighSpeed: Boolean);
var
  B: TBitmapCtx;
  Bmp: TBitmap;
begin
  if FContext <> nil then
  begin
    Bmp := ABitmap;
    if Bmp.HandleAllocated then
    begin
      B := TBitmapCtx(Bmp.Handle);
      FCanvasHelper.TexRect(TransformBounds(CornersF(DstRect)), CornersF(SrcRect.Left, SrcRect.Top, SrcRect.Width,
        SrcRect.Height), B.PaintingTexture, PrepareColor(FModulateColor, AOpacity));
    end;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 23. Mai 2016, 17:59
Hmm das ist ja ärgerlich :/ Dann nehme ich mal an, dass das so ohne weiteres nicht funktioniert ohne irgendwas zu basteln was stark auf die performance geht, oder?

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 23. Mai 2016, 18:04
Selbst die Größe des Bildes anpassen, damit das nicht automatisch geschieht.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 23. Mai 2016, 18:11
Selbst die Größe des Bildes anpassen, damit das nicht automatisch geschieht.
Also du meinst das Bitmap selbst auf die Rendergrösse strecken und dann ausgeben?

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 24. Mai 2016, 11:27
Selbst die Größe des Bildes anpassen, damit das nicht automatisch geschieht.
Also du meinst das Bitmap selbst auf die Rendergrösse strecken und dann ausgeben?
Wäre ein gangbarer Weg.
So hast du selber Einfluss auf die Art und Weise, wie du streckst und interpolierst.
Danach wäre vom neuen Bild die Größe von SrcRect = DstRect beim Aufruf von TCanvas.DrawBitmap.
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 25. Mai 2016, 07:39
Hmm...
Gibt es da eine Hauseigene Lösung von Firemonkey oder müsste ich das wirklich über Set/GetPixel oder ScanLine machen?
Mir würde da leider kein anderer Weg in den Sinn kommen... Wäre halt wichtig das es performant genug ist, sonst müsste ich das ohne machen...
Finde das irgendwie schade das Firemonkey das nicht so rendert obwohl ich das so gesetzt habe, aber naja :/

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 25. Mai 2016, 09:52
Ich hätte beinahe gesagt, dass du TBitmap.CreateThumbnail nutzen kannst, aber das nutzt ja intern auch DoDrawBitmap.
Da stehste dann wieder vor dem gleichen Problem.
Eventuell kannst du einfach schon geklotzt die originale Grafik zeichnen?
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 25. Mai 2016, 10:08
Ich hätte beinahe gesagt, dass du TBitmap.CreateThumbnail nutzen kannst, aber das nutzt ja intern auch DoDrawBitmap.
Da stehste dann wieder vor dem gleichen Problem.
Wäre auch zu schön gewesen Aber habe leider bisher keine funktion in Firemonkey dafür gefunden :/

Eventuell kannst du einfach schon geklotzt die originale Grafik zeichnen?
Wie meinst du das genau? Das Bild einfach selbst vergrössern mit nem Programm und dann anzeigen?
Würde leider nicht gehen weil das Echtzeit-Bild berechnet wird ^^

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas

  Alt 26. Mai 2016, 17:12
Hier geht's doch um dein Spiel in isometrischer Perspektive, oder?
Du willst doch so eine Retro-Computer-Klötzchengrafik, richtig?

In welcher Auflösung generierst du denn dein Originalbild?
In welche Zellauflösung soll's denn kopiert werden?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz