Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas (https://www.delphipraxis.net/189262-drawbitmap-pixelated-mit-firemonkey-unter-android-gpucanvas.html)

milos 23. Mai 2016 15:22

DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Liste der Anhänge anzeigen (Anzahl: 1)
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

TiGü 23. Mai 2016 16:36

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
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;

milos 23. Mai 2016 16:59

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
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

himitsu 23. Mai 2016 17:04

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Selbst die Größe des Bildes anpassen, damit das nicht automatisch geschieht.

milos 23. Mai 2016 17:11

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von himitsu (Beitrag 1338757)
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

TiGü 24. Mai 2016 10:27

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von milos (Beitrag 1338758)
Zitat:

Zitat von himitsu (Beitrag 1338757)
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.

milos 25. Mai 2016 06:39

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Hmm...
Gibt es da eine Hauseigene Lösung von Firemonkey oder müsste ich das wirklich über Set/GetPixel oder ScanLine machen? :D
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

TiGü 25. Mai 2016 08:52

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
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?

milos 25. Mai 2016 09:08

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von TiGü (Beitrag 1338895)
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 :D Aber habe leider bisher keine funktion in Firemonkey dafür gefunden :/

Zitat:

Zitat von TiGü (Beitrag 1338895)
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? :D
Würde leider nicht gehen weil das Echtzeit-Bild berechnet wird ^^

Freundliche Grüsse

TiGü 26. Mai 2016 16:12

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
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?

milos 27. Mai 2016 04:10

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von TiGü (Beitrag 1339000)
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?

Genau, das ist richtig :thumb:

Die Renderauflösung kann man je nach grösse der Ausgabe verändern was auf dem PC auch sehr gut klappt. Auf dem Android mit 308x180 rendering welches in 616x360 angezeigt wird (also quasi 2x vergrössert) sieht das leider sehr "matschig" aus :/

Freundliche Grüsse

TiGü 27. Mai 2016 12:22

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Aber das liegt doch nur an der Interpolation.
Erzeuge doch gleich in der Zielauflösung das Klötzchen-Bild!

Oder du guckst dir mal den TCanvasGpu an und den dahinterliegenden Context, vielleicht kann man ja doch irgendwo den Interpolationsmodus einstellen. Dann entsprechend anpassen und die veränderten Units zum Projekt hinzufügen und den modifierten Canvas registrieren.

Der schöne Günther 27. Mai 2016 12:55

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Ich kenne mich mit FireMonkey noch nicht wirklich aus, aber eine ganz dumme Idee: Was ist denn einen
Delphi-Quellcode:
TPixelateEffect
auf das Bild zu legen? Über
Delphi-Quellcode:
BlockSize
kann man die Verpixelung einstellen...

Klar, es ist unnötig das Bild erst hoch-zuinterpolieren um es dann wieder künstlich zu verpixeln, aber besser eine Notlösung als gar keine...

milos 28. Mai 2016 16:27

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von TiGü (Beitrag 1339036)
Aber das liegt doch nur an der Interpolation.
Erzeuge doch gleich in der Zielauflösung das Klötzchen-Bild!

Das weiss ich ja, und wie eben schon gesagt rendere ich das Bild in echtzeit und mir würde nur der Weg mit Set/GetPixel in den Sinn kommen und das würde keinen Sinn machen :D

Zitat:

Zitat von TiGü (Beitrag 1339036)
Oder du guckst dir mal den TCanvasGpu an und den dahinterliegenden Context, vielleicht kann man ja doch irgendwo den Interpolationsmodus einstellen. Dann entsprechend anpassen und die veränderten Units zum Projekt hinzufügen und den modifierten Canvas registrieren.

Daran hab ich auch schon gedacht aber das ist schon ziemlich hart finde ich an den Units rumzuschrauben, ich glaube ich kann da vieles falsch machen :D

Zitat:

Zitat von Der schöne Günther (Beitrag 1339042)
Ich kenne mich mit FireMonkey noch nicht wirklich aus, aber eine ganz dumme Idee: Was ist denn einen
Delphi-Quellcode:
TPixelateEffect
auf das Bild zu legen? Über
Delphi-Quellcode:
BlockSize
kann man die Verpixelung einstellen...

Klar, es ist unnötig das Bild erst hoch-zuinterpolieren um es dann wieder künstlich zu verpixeln, aber besser eine Notlösung als gar keine...

Vielen Dank, diesen Effekt kannte ich noch gar nicht und bringt den gewünschten Effekt, auch wenn leider nicht optimal schön gelöst :D
Hab noch keine tests machen können aber als Not-Lösung wäre es bestimmt geeignet falls ich nichts anderes finde. :thumb:

Freundliche Grüsse

Harry Stahl 29. Mai 2016 12:15

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von milos (Beitrag 1339093)
Vielen Dank, diesen Effekt kannte ich noch gar nicht und bringt den gewünschten Effekt, auch wenn leider nicht optimal schön gelöst :D
Hab noch keine tests machen können aber als Not-Lösung wäre es bestimmt geeignet falls ich nichts anderes finde. :thumb:

Freundliche Grüsse

Wenn Du den noch nicht kanntest, hier gibt es eine gute Übersicht, was die einzelnen FMX-Effekte so machen (incl. beispielhafter bildlicher Darstellung):

http://docwiki.embarcadero.com/RADSt..._Image_Effects

milos 29. Mai 2016 12:21

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Wenn Du den noch nicht kanntest, hier gibt es eine gute Übersicht, was die einzelnen FMX-Effekte so machen (incl. beispielhafter bildlicher Darstellung):

http://docwiki.embarcadero.com/RADSt..._Image_Effects
Danke dafür, da sieht man doch alle sehr schön dargestellt. :thumb:
Weisst du gerade züfällig ob es möglich ist diese Effekte auf z.B. ein TBitmap anwenden kann und dann ein TCanvas oder TBitmap zurückbekommen kann? Also ohne das man diese nur zwingend mit Controls anwenden kann.

Freundliche Grüsse

Harry Stahl 29. Mai 2016 17:57

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von milos (Beitrag 1339126)
Weisst du gerade züfällig ob es möglich ist diese Effekte auf z.B. ein TBitmap anwenden kann und dann ein TCanvas oder TBitmap zurückbekommen kann? Also ohne das man diese nur zwingend mit Controls anwenden kann.

Freundliche Grüsse

Ja, "zufällig" habe ich in meinem Firemonkey-Buch im Abschnitt über Grafikprogrammierung hierüber einige Ausführungen gemacht und eine kleine Bespiel-Prozedur für diesen Zweck gezeigt.:wink:

Die sieht so aus:
Delphi-Quellcode:
function ImgByFilter(bm: TBitmap; FilterName: string): TBitmap;
var
  bmold: TBitmap;
  Filter: FMX.Filter.TFilter;
begin
  Filter := TFilterManager.FilterByName(FilterName);

  if Filter <> nil then
  begin
    bmold := TBitmap.Create (0,0);
    bmOld.Assign(bm);

    // set input
    Filter.ValuesAsBitmap['Input'] := bmOld;

    // set Target only for transition
    Filter.ValuesAsBitmap['Target'] := bm;
   
    // apply and get result
    Result := Filter.ValuesAsBitmap['output'];

    bmOld.Free;
  end;

end;
Aufruf wäre dann z.B. so:

Delphi-Quellcode:
  MyResultBitmap.assign (ImgByFilter (SourceBitmap, 'Pixelate'));
  // oder, wenn das Original verändert werden soll
  // auch "MyBitmap.assign (ImgByFilter (MyBitmap, 'Pixelate'));"
Hatte darauf hingewiesen, dass es nur ein Beispiel ist, für den direkten Abruf von Parameterlosen Filtern / Effekten.

Wenn Du z.B. noch beim Pixelate-Effekt den Blockcount-Wert berücksichtigen willst, könntest Du die Prozedur mit entsprechenden Parameter-Einträgen ergänzen.

In der Procedure könntest Du vor der Zuweisung dann z.B. das wie folgt ergänzen:
Delphi-Quellcode:
if FilterName = 'Pixelate' then begin
  Filter.ValuesAsFloat['BlockCount'] := BlockCountPara; // z.B. 30
end;
Edit: Ach ja, die Units FMX.Filter und FMX.Filter.Standard müssen manuell eingebunden werden, sonst werden nicht alle Filter gefunden.

milos 5. Jun 2016 04:29

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Vielen Dank Harry, das ist genau das was ich gemeint habe.
Funktioniert perfekt! :thumb:

Freundliche Grüsse

Harry Stahl 5. Jun 2016 12:42

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Prima, das freut mich.

Übrigens, das Bildchen in Beitrag Nr. 11 und der Hinweis, dass es um Spieleentwicklung geht, macht mich ein wenig neugierig:

Mich würde interessieren, verwendest Du da nur FMX-3D-Objekte und Standards oder nutzt Du auch Low Level Routinen z.B. aus der OpenGL Api?

milos 6. Jun 2016 02:24

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von Harry Stahl (Beitrag 1339551)
Übrigens, das Bildchen in Beitrag Nr. 11 und der Hinweis, dass es um Spieleentwicklung geht, macht mich ein wenig neugierig:

Mich würde interessieren, verwendest Du da nur FMX-3D-Objekte und Standards oder nutzt Du auch Low Level Routinen z.B. aus der OpenGL Api?

Da werden mich wohl einige wieder mit grossen Augen ansehen und fragen ob ich noch alle Tassen im Schrank habe, aber auf dem Bild sieht man eine ziemlich fortgeschrittene Version von meiner Software-Render-Engine. :D Habe Z-Buffering und Backface-Culling erfolgreich implementiert und das ganze läuft sogar ziemlich gut auf den Computern und Smartphones die ich testen konnte. Ich bin gerade dabei das ganze nochmal durchzuplanen und neu zu schreiben denn es gibt einiges das ich besser machen könnte vor allem das mit den Texturen. :D

Ich habe Firemonkey 3D kurz probiert, war jedoch nicht wirklich davon überzeugt um es für ein Spiel zu verwenden... Vielleicht habe ich nicht lange genug damit rumgespielt um die Stärken darin zu sehen falls welche vorhanden sind.

OpenGL würde ich gerne brauchen... Habe ich jedoch schon öfters mal probiert anzupacken, jedoch war es mir immer zu kompliziert und ich habe aufgegeben.
Und wie das mit OpenGL ES aussieht weiss ich nicht, da müsste ich mich noch informieren wie das mit FMX und Cross-Platform-Unterstützung aussieht und was man damit eigentlich alles machen kann. Falls jemand dazu gute Links hat in denen man sich in FMX & OpenGL ES einarbeiten kann würde ich mich sehr freuen! :D

Freundliche Grüsse

Harry Stahl 9. Jun 2016 22:48

AW: DrawBitmap Pixelated mit Firemonkey unter Android/GPUCanvas
 
Zitat:

Zitat von milos (Beitrag 1339570)
Zitat:

Zitat von Harry Stahl (Beitrag 1339551)
Übrigens, das Bildchen in Beitrag Nr. 11 und der Hinweis, dass es um Spieleentwicklung geht, macht mich ein wenig neugierig:

Mich würde interessieren, verwendest Du da nur FMX-3D-Objekte und Standards oder nutzt Du auch Low Level Routinen z.B. aus der OpenGL Api?

Da werden mich wohl einige wieder mit grossen Augen ansehen und fragen ob ich noch alle Tassen im Schrank habe, aber auf dem Bild sieht man eine ziemlich fortgeschrittene Version von meiner Software-Render-Engine. :D Habe Z-Buffering und Backface-Culling erfolgreich implementiert und das ganze läuft sogar ziemlich gut auf den Computern und Smartphones die ich testen konnte. Ich bin gerade dabei das ganze nochmal durchzuplanen und neu zu schreiben denn es gibt einiges das ich besser machen könnte vor allem das mit den Texturen. :D

Wow, beeindruckend!:thumb: Da kann man ja schon mal gespannt sein, was da am Ende rauskommt.

Zitat:

Zitat von milos (Beitrag 1339570)
Ich habe Firemonkey 3D kurz probiert, war jedoch nicht wirklich davon überzeugt um es für ein Spiel zu verwenden... Vielleicht habe ich nicht lange genug damit rumgespielt um die Stärken darin zu sehen falls welche vorhanden sind.

Ah, OK. Will selber auch kein Spiel schreiben, suche nur nach überzeugenden Beispielen, auf die man verweisen könnte ("mit FMX-3D erstellt").


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 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