AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

max. TBitmap FMX vs. VCL

Ein Thema von bernhard_LA · begonnen am 22. Aug 2020 · letzter Beitrag vom 23. Aug 2020
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von himitsu
himitsu

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

AW: max. TBitmap FMX vs. VCL

  Alt 22. Aug 2020, 18:46
Da hast du jetzt ein Problem, beim FMX.Graphics.TBitmap


Delphi-Quellcode:
procedure TBitmap.SetSize(const AWidth, AHeight: Integer);
begin
  ..
  if (AWidth > CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize)) or
     (AHeight > CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize))
  then
    raise EBitmapSizeTooBig.CreateRes(@SBitmapSizeTooBig);
Das hier klingt zwar nett,
Delphi-Quellcode:
type
  TCanvas = class abstract(TInterfacedPersistent)
  public const
    MaxAllowedBitmapSize = $FFFF;
aber im FMX für Windows landet es bei TCanvasD2D und dort ist es nur 8192.

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  with TBitmap.Create(6000, 6000) do begin
    ShowMessage(CanvasClass.ClassName + ' ' + CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize).ToString);
    Free;
  end;
end;
Eventuell kann man das TBitmap auch mit einem anderen BitmapImage/Canvas erstellen?
siehe TBitmapImage.CreateHandle -> CanvasClass.InitializeBitmap -> ...
oder TBitmap.GetCanvasClass -> TBitmapImage.GetCanvasClass -> TCanvasManager.GetDefaultCanvas -> FDefaultCanvasClass
$2B or not $2B

Geändert von himitsu (22. Aug 2020 um 18:53 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: max. TBitmap FMX vs. VCL

  Alt 22. Aug 2020, 22:40
8K * 8K pixel ist ja gar nix .....
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#13

AW: max. TBitmap FMX vs. VCL

  Alt 23. Aug 2020, 13:15
Ich vermute mal stark, dass das letztlich damit zusammen hängt, dass FMX mittels D3D zeichnet, und Bitmaps daher als Textur eingehen. So weit ich weiß, sind die maximalen Texturgrößen gerade bei den Nicht-Gamer-Grafikkarten teils ziemlich begrenzt - 8192² scheint mir da plausibel.

Wahrscheinlich muss man die Bilddatei vorab in eine eigene Datenstruktur bringen, aus der man dann Pixeldaten in kleineren Rechtecken zur Anzeige an die API geben kann. Man verliert natürlich die ganzen vorgefertigten Zeichenfunktionen - es sei denn, man führt diese auf den kleineren Rechtecken in einem API Bitmap aus, und überträgt diese wieder zurück in die eigene Struktur.

Letztlich bleibt aber auch festzuhalten, dass Bitmaps solcher Größe klar in die Rubrik "Spezialanwendung" fallen, deren native Unterstützung man, finde ich, nicht unbedingt in einer so allgemein gedachten API wie FMX (oder auch VCL) voraussetzen kann.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: max. TBitmap FMX vs. VCL

  Alt 23. Aug 2020, 16:06
Die registrierten TCanvasManager.FCanvasList kann man leider nicht ändern (strict private),
aber hab bissl was gefunden.

FMX.Canvas.D2D : TCustomD2D, TCustomBitmapCodecWIC= BMP JPEG PNG GIF TIFF ICO WMP ... WIC klingt ja eigentlich nicht schlecht
FMX.Canvas.GDIP : TCanvasGdiPlus
FMX.Canvas.GPU : TCustomCanvasGpu, TBitmapCtx
FMX.Canvas.Mac : TCanvasQuartz, TQuartzBitmap
FMX.Graphics : TPrinterCanvas

In TCanvasManager.GetDefaultCanvas an TCanvasManager.FDefaultCanvasClass kommst nicht ran.
TBitmap.GetCanvasClass oder TBitmapImage.GetCanvasClass lassen sich auch nicht überschreiben.
TBitmapImage/TCanvas/TCanvasClass kann man im TBitmap nicht zuweisen/austauschen. (keine aufrufbaren Setter-Methoden oder Write-Property)
TCanvasManager.RegisterCanvas kann man aufrufen und eine Canvas-Klasse nochmal mit anderen Parametern registrieren (Default=True), aber bringt nichts, weil es zuletzt gefunden und somit ignoriert wird.
So gesehn ist das schon ein bissl krank.

Hatte gedacht/gehofft so kommt was Anderes raus, aber es bleibt bei TCustomD2D mit 8192.
Delphi-Quellcode:
TCanvasManager.EnableSoftwareCanvas(True);
Image := TBitmap.Create(x, y);
TCanvasManager.EnableSoftwareCanvas(False);
FMX.Canvas.GDIP, FMX.Canvas.GPU ins USES, selbst wenn in der DPR als Erstes, ändert nichts.

Delphi-Quellcode:
class function TCanvasD2D.GetAttribute(const Value: TCanvasAttribute): Integer;
const
  DefaultMaxTextureSize = 8192; // According DirectX 10 specification.
Das wäre per se überschreibbar (override), aber hilft nichts, da sich die Ableitung nicht einbinden lässt, bzw. das originale TCanvasD2D immer zuerst gefunden wird.


Bleibt wohl nur eine Beschwerde im QualityPortal und auf Delphi 10.9 warten.
Oder eine externe Graphic-Lib verwenden.

Im Windows kannst dir auch das VCL-TBitmap reinholen.
$2B or not $2B

Geändert von himitsu (23. Aug 2020 um 17:27 Uhr)
  Mit Zitat antworten Zitat
TurboMagic

Registriert seit: 28. Feb 2016
Ort: Nordost Baden-Württemberg
2.960 Beiträge
 
Delphi 12 Athens
 
#15

AW: max. TBitmap FMX vs. VCL

  Alt 23. Aug 2020, 16:27
Na dann erstell doch mal so einen QP report...
Auf dass wir das flexibler bekommen.
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.538 Beiträge
 
Delphi 11 Alexandria
 
#16

AW: max. TBitmap FMX vs. VCL

  Alt 23. Aug 2020, 17:50
Es hängt tatsächlich von der verwendeten Canvas-Klasse ab. Man kann da leider nur global drauf Einfluss nehmen.

Standardmäßig wird die TcanvasD2D Klasse verwendet, wenn man die ausschaltet, dann wird TCanvasGDIPlus verwendet, das funktioniert zumindest unter Windows und Linux (MACOS habe ich nicht ausprobiert).

Wenn man also in der .DPR-Datei, direkt als ersten Befehl

 GlobalUseDirect2D := false; eingebt (also noch vor "Application.Initialize"), kann man Grafiken in der Größe 65000x65000 Bildpunkte erzeugen und verarbeiten, siehe anliegenden Screenshot (mit Source-Code) ein geladenes Bild unter Linux mit 21.600 x 10.800 Bildpunkten (größeres Bild habe ich gerade nicht zur Hand).

Dafür muss noch die Unit FMX.Types in die DPR-Datei eingebunden werden.

Die Nichtverwendung von Direct2D wird allerdings nachteilige Auswirkungen auf die allgemeine Performance der App haben, wie groß, müsstest Du prüfen. Unter Umständen könnte man dann überlegen, eine Extra App zu machen, welche für die Verarbeitung dieser großen Bild-Dateien zuständig ist (und dann eben nur dieser Part etwas langsamer wäre).
Miniaturansicht angehängter Grafiken
bigimage.jpg  

Geändert von Harry Stahl (23. Aug 2020 um 18:03 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: max. TBitmap FMX vs. VCL

  Alt 23. Aug 2020, 18:07
GlobalUseDirect2D := false;
Das wird in RegisterCanvasClasses verwendet, also meinen TestCode angepasst.
Delphi-Quellcode:
if GlobalUseDirect2D then begin
  FMX.Canvas.D2D.UnregisterCanvasClasses;
  TCanvasManager.EnableSoftwareCanvas(False); // um den Cache (FDefaultCanvasClass) zu löschen
end;
with TBitmap.Create(6000, 6000) do begin
  if GlobalUseDirect2D then begin
    FMX.Canvas.D2D.RegisterCanvasClasses;
    TCanvasManager.EnableSoftwareCanvas(False); // um den Cache zu löschen
  end;
  ShowMessage(CanvasClass.ClassName + ' ' + CanvasClass.GetAttribute(TCanvasAttribute.MaxBitmapSize).ToString);
  Free;
end;
Aber neee, hilft nix.


Allerdings das GlobalUseGPUCanvas := True; // FMX.Types ändert es zu "TCanvasGpu 16384" (auch ohne den Deregistrierungs-Code), aber hilft auch nicht viel mehr.
$2B or not $2B
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 07:24 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