Autor Beitrag
Mashalla
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Windows 7 Professional
Delphi 7 Enterprise, Turbo Delphi Explorer 2006
BeitragVerfasst: So 27.12.09 16:09 
Hey,
ich programmiere zur Zeit an einem Bildbetrachter. Dazu verwende ich die TImage-Komponente in Verbindung mit GraphicEx. Nun besteht aber das Problem, dass Bilder ab 7 MP ungefähr schon knapp eine Sekunde zum Laden brauchen. Die Bilder liegen auf der Festplatte und werden mittels LoadFromFile(...) in die Image-Komponente gepackt. Ich habe auch eine Diashowfunktion realisiert, welche allerdings beim 2 Sekunden Intervall an ihre Grenzen gerät, da das aktuell geladene Bild fast zeitgleich vom schwarzen Bildschirm der Image-Komponente, welcher andeutet, dass das nächste Bild geladen wird, ersetzt wird. Es dauert einfach zu lange, die Bilder zu laden.

Jetzt ist meine Frage, wie ich den Vorgang beschleunigen kann?

Ich dachte daran, die nächsten Bilder vorzuladen, während das Programm gerade im Leerlauf ist. Weiß allerdings nicht genau, wie ich da vorgehen sollte und wo ich die Bilder speichern sollte, damit sie möglichst flott ins TImage eingefügt werden können. Ansatz war, 3 Images zu verwenden. Vorheriges Bild <> Aktuelles Bild <> Nächstes Bild und diese dann einfach mit Image.Visible entsprechend zu benutzen...

Najo, Tipps? :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 27.12.09 18:03 
Das Problem ist ja, dass das Laden im Hintergrund eigentlich nur in einem Thread Sinn macht. Gleichzeitig kannst du dort aber die Grafikkomponenten nicht ansprechen.

Möglichkeiten:
Im Hintergrund im Thread die Dateien in einen MemoryStream einlesen und dann aus diesem laden, das bringt vermutlich schon etwas Zeitvorteil.
Im Thread auch ein verkleinertes Vorschaubild direkt erzeugen, dafür dann mit Synchronize arbeiten. Nachteil: Die Oberfläche hängt dafür dann immer kurz.
Mashalla Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48

Windows 7 Professional
Delphi 7 Enterprise, Turbo Delphi Explorer 2006
BeitragVerfasst: So 27.12.09 19:26 
Ich weiß jetzt nicht, was bei der Operation die meiste Zeit verbraucht, aber wenn es das Laden der Daten ist, dann würde der MemoryStream sinnvoll sein, sofern das Laden aus dem Stream schneller geht als direkt von der Festplatte (wovon ich stark ausgehe nach deiner Antwort). Kann ich vielleicht als Zusatz oder Alternative irgendwie das Bild in verringerter Qualität oder schrittweise laden, also eine Art Interlacing? Oder große Bilder runterskalieren?

Die Sache mit der nicht reagierenden Oberfläche ist auch etwas unschön, werde mich aber morgen mal mit dem MemoryStream befassen ;)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19313
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 27.12.09 19:48 
user profile iconMashalla hat folgendes geschrieben Zum zitierten Posting springen:
sofern das Laden aus dem Stream schneller geht als direkt von der Festplatte (wovon ich stark ausgehe nach deiner Antwort)
Schneller in jedem Fall, die Frage ist eben nur wie viel. Den größeren Teil der Zeit wird vermutlich die Anzeige selbst brauchen.

user profile iconMashalla hat folgendes geschrieben Zum zitierten Posting springen:
Kann ich vielleicht als Zusatz oder Alternative irgendwie das Bild in verringerter Qualität oder schrittweise laden, also eine Art Interlacing?
Jein. Das geht bei manchen Dateitypen schon, bei Bitmaps zum Beispiel, aber das müsste man dann wohl selbst umsetzen.

user profile iconMashalla hat folgendes geschrieben Zum zitierten Posting springen:
Oder große Bilder runterskalieren?
Das sowieso, aber sofern du dafür auf einer Leinwand zeichnest oder so wird das nicht ohne Synchronisation im Thread gehen.

user profile iconMashalla hat folgendes geschrieben Zum zitierten Posting springen:
Die Sache mit der nicht reagierenden Oberfläche ist auch etwas unschön
Der einzige Weg das zu vermeiden wäre eine komplett nonvisuelle Lösung die Bilder zu skalieren, das ist ja eigentlich kein Problem. Die Standardkomponenten benötigen aber wohl eine Leinwand und laufen dementsprechend nicht in Threads.