Schnelles Laden von Bildern Crossplatform

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Schnelles Laden von Bildern Crossplatform

Beitrag von Rhyt »

Das Laden und Anzeigen von Bildern ist relativ langsam im vergleich zu Firemonkey. Kennt jemand eine Möglichkeit das zu beschleunigen? ich hab im Forum nur Möglichkeiten für Windows speziell gefunden...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von af0815 »

Rhyt hat geschrieben:
Mo 18. Mär 2024, 13:27
Das Laden und Anzeigen von Bildern ist relativ langsam im vergleich zu Firemonkey. Kennt jemand eine Möglichkeit das zu beschleunigen? ich hab im Forum nur Möglichkeiten für Windows speziell gefunden...
Hast du ein Beispiel, das zeigt wie langsam das ist und wie du lädst ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von Rhyt »

Ein links mit 2 Videos die ich gemacht habe
https://file.io/j4ITDNFdwDNv
hab 2 kleine videos gemacht die das zeigen.
Die Bilder sind ca. 10 MB groß jeweils.
Man sieht deutlich den unterschied. In Lazsarus braucht es gut mal 2 Sekunden gefühlt, und im FMX keine halbe Sekunde.

in Lazarus nutze ich folgendes

Code: Alles auswählen

ATImageBox1.LoadFromFile(DirectoryPath + '/' + FileListBox1.GetSelectedText);          
Das selbe mache ich auch in Firemonkey aber halt mit der TImage Komponente

hab auch schon mit BGRABitmap herumprobiert und so weiter, aber es ist einfach sehr langsam beim laden.

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von theo »

10MB sind ganz schön happig für ein Bild.
Wozu dienen die? LKW-Planen bedrucken? :wink:
2 Sekunden finde ich dafür angemessen.

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von Rhyt »

XD die kommen halt so von meiner Canon :)
Ist aber schon lange im vergleich. muss doch schneller gehen irgendwie.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von wp_xyz »

Rhyt hat geschrieben:
Mo 18. Mär 2024, 17:58
Man sieht deutlich den unterschied. In Lazsarus braucht es gut mal 2 Sekunden gefühlt, und im FMX keine halbe Sekunde.
Ein 10MB Bild muss im Vergleich zum Bildschirm riesengroß sein. Wenn man das Bild dann nur ansehen will, muss man nicht jedes Detail laden. JPEG hat die Möglichkeit nur jedes zweite, vierte oder achte Pixel zu laden. Ich könnte mir vorstellen, dass bei einem 10MB JPeg auch ein Viertel noch den Bildschirm gut füllt - wenn FMX das so macht, dann wäre der Faktor 4 zwischen 2 und 1/2 Sekunde gleich erklärt... Die dafür zuständige JPegImage-Property wäre Scale (= jsFullSize, jsHalf, jsQuater, jsEighth) - siehe beigefügtes Projektchen.
Dateianhänge
jpeg_Scale_Performance.zip
(90.01 KiB) 72-mal heruntergeladen

Benutzeravatar
theo
Beiträge: 10500
Registriert: Mo 11. Sep 2006, 19:01

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von theo »

Wenn man "schneller" will, muss man genauer werden.
Was ist das Dateiformat? JPEG?
Wir gross muss das Bild zur Anzeige sein? Nur eine Vorschau oder die volle Auflösung bei vollen Dimensionen?

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von wp_xyz »

theo hat geschrieben:
Mo 18. Mär 2024, 21:31
Wenn man "schneller" will, muss man genauer werden.
Genauer? Ich denke: ungenauer. Wie im täglichen Leben, wenn der Chef eine Arbeit schneller haben will, muss man sie sie halt schlampiger erledigen.

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von Rhyt »

Mir gehts eigentlich nur darum, kurz Bilder zu sichten und zu Taggen wenn ich möchte, daher sollte die Ladezeit schon schnell sein und die Darstellungsqualität recht vernünftig sein.

Code: Alles auswählen

    jpg.Scale := jsQuarter;
      jpg.Performance := jpBestSpeed;
        t := Now;
      jpg.LoadFromFile(DirectoryPath + '/' + FileListBox1.GetSelectedText);

       ATImageBox1.Picture.Assign(jpg);          
       
jetzt lädt das Bild schonmal schneller... Anstelle von 1.223 sec. in 0.337 sec.
allerdings ist es immer noch Doppel so langsam beim laden und anzeigen wie die FMX mit 0.180 und hat eine schlechtere Bild Qualität.
Hier hinein gezoomt. Oben das gleiche Bild in der Fmx Anwendung und unten Laz.

Bildschirmfoto 2024-03-18 um 22.41.47.png
(2.31 MiB) Noch nie heruntergeladen
Es solle möglich viele Bildformate anzeigen können, png usw. ich suche immer noch einen Weg CR3 / Raw anzeigen zu können. Das ist jetzt erstmal aber nicht so die Prio. Es ist eher ein, ich versuche zu verstehen wie das ganze mit den Bildern überhaupt funktioniert Projekt.

wp_xyz
Beiträge: 4895
Registriert: Fr 8. Apr 2011, 09:01

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von wp_xyz »

Das habe ich gerade gefunden: SynopseGDIPlus - das ersetzt die Standard Bild-Formate durch gleichnamige schnellere Varianten, sofern die Unit SynGdiPlus nach Graphics in der uses-Zeile steht. Im dem beigefügten Testprojekt lädt eine 30MB jpeg-Datei in 0.15 sec (statt 3 sec mit der Standard-Unit). Das sehe ich in einer 64-Bit Anwendung; bei 32-bit ist der Unterschied nicht ganz so groß. Nachteil: GDI+ gibt es nur für Windows.
Dateianhänge
SynposeGDIPlus_Demo.zip
(38.86 KiB) 120-mal heruntergeladen

TSchnuckenbock
Beiträge: 72
Registriert: Do 20. Jul 2017, 23:47
OS, Lazarus, FPC: Win7 und Win10
CPU-Target: xxBit
Wohnort: Südheide (Schnuckenland)

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von TSchnuckenbock »

Mal ein Schuß ins Blaue: Firemonkey/FMX nutzt doch die Grafikbeschleunigung, indem Dinge auf die Grafikkarte ausgelagert werden. Könnte es sein, daß bei FMX die Bilddatei in die Grafikkarte geladen wird und dann von der Grafikkarte dekodiert und auf die Oberfläche gedonnert wird?

Ich bin jetzt zu faul mir Code zu schreiben und dann mal in die FMX-Komponenten reinzudebuggen, um zu sehen, ob man da was sehen kann, wie es umgesetzt ist.

Mathias
Beiträge: 6209
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von Mathias »

Könnte es sein, daß bei FMX die Bilddatei in die Grafikkarte geladen wird und dann von der Grafikkarte dekodiert und auf die Oberfläche gedonnert wird?
Wen dies so ist, gibt es sicher eine C-lib, welches dies kann.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von Rhyt »

wp_xyz hat geschrieben:
Di 19. Mär 2024, 00:58
Das habe ich gerade gefunden: SynopseGDIPlus - das ersetzt die Standard Bild-Formate durch gleichnamige schnellere Varianten, sofern die Unit SynGdiPlus nach Graphics in der uses-Zeile steht. Im dem beigefügten Testprojekt lädt eine 30MB jpeg-Datei in 0.15 sec (statt 3 sec mit der Standard-Unit). Das sehe ich in einer 64-Bit Anwendung; bei 32-bit ist der Unterschied nicht ganz so groß. Nachteil: GDI+ gibt es nur für Windows.
Danke für das Beispiel Projekt, ja leider nur für Windows.

Rhyt
Beiträge: 70
Registriert: Mo 28. Nov 2022, 20:22

Re: Schnelles Laden von Bildern Crossplatform

Beitrag von Rhyt »

Mathias hat geschrieben:
Di 19. Mär 2024, 08:27
Könnte es sein, daß bei FMX die Bilddatei in die Grafikkarte geladen wird und dann von der Grafikkarte dekodiert und auf die Oberfläche gedonnert wird?
Wen dies so ist, gibt es sicher eine C-lib, welches dies kann.
Wonach müsste ich denn da suchen?

Antworten