Schnelles Laden von Bildern Crossplatform
Schnelles Laden von Bildern Crossplatform
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...
- 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
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).
Re: Schnelles Laden von Bildern Crossplatform
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
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.
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);
hab auch schon mit BGRABitmap herumprobiert und so weiter, aber es ist einfach sehr langsam beim laden.
Re: Schnelles Laden von Bildern Crossplatform
10MB sind ganz schön happig für ein Bild.
Wozu dienen die? LKW-Planen bedrucken?
2 Sekunden finde ich dafür angemessen.
Wozu dienen die? LKW-Planen bedrucken?
2 Sekunden finde ich dafür angemessen.
Re: Schnelles Laden von Bildern Crossplatform
XD die kommen halt so von meiner Canon
Ist aber schon lange im vergleich. muss doch schneller gehen irgendwie.
Ist aber schon lange im vergleich. muss doch schneller gehen irgendwie.
Re: Schnelles Laden von Bildern Crossplatform
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
Re: Schnelles Laden von Bildern Crossplatform
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?
Was ist das Dateiformat? JPEG?
Wir gross muss das Bild zur Anzeige sein? Nur eine Vorschau oder die volle Auflösung bei vollen Dimensionen?
Re: Schnelles Laden von Bildern Crossplatform
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.
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.
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.
Code: Alles auswählen
jpg.Scale := jsQuarter;
jpg.Performance := jpBestSpeed;
t := Now;
jpg.LoadFromFile(DirectoryPath + '/' + FileListBox1.GetSelectedText);
ATImageBox1.Picture.Assign(jpg);
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.
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.
Re: Schnelles Laden von Bildern Crossplatform
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
-
- 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
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.
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.
-
- Beiträge: 6210
- 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
Wen dies so ist, gibt es sicher eine C-lib, welches dies kann.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?
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
Re: Schnelles Laden von Bildern Crossplatform
Danke für das Beispiel Projekt, ja leider nur für Windows.wp_xyz hat geschrieben: ↑Di 19. Mär 2024, 00:58Das 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.