Autor Beitrag
DJ Raptor
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
D2005
BeitragVerfasst: Do 24.06.04 15:14 
In einem Bildverwaltungsprogramm für Fotografen lade ich Bilder von der Festplatte per LoadFromFile Anweisung in eine imageList um die Daten später ohne Verzögerung anzeigen zu können. Allerdings steigt die Speicherauslastung meines Programms nach dem laden der Bilder in Dimensionen die in keinem Zusammenhang mehr stehen (zB laden von 23 Bilder mit einer Gesamtgröße von 9 MB, Speicherverbrauch des Programms ca 170 MB). Habe zwar beim Suchen einen Hinweis auf Fehler in der Speicherverwaltung von Delphi gefunden aber keinen konkreten Hinweis zur Lösung meines Problems. Ich verwende die imageList32 Komponente der graphics32 Library (g32.org), das Problem taucht aber auch bei der normalen imageList auf. Hoffe auf einige Lösungsvorschläge.
sourcehunter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 482

Win XP | Suse 10.1
Delphi 2005 Pers.
BeitragVerfasst: Do 24.06.04 15:54 
Kann es sein, dass die Bilder komprimiert sind? Außerdem musst den ganzen "Verwaltungskram" mit beachten. Aber ich denke das rechtfertigt nicht diese gigantische Aufblähung.

_________________
Linux und OpenSource rulez!
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 24.06.04 15:56 
Hallo und :welcome:
Mal ins blaue geraten...lädst du vielleicht Jpgs in eine TBitmap-ähnliche Struktur? Ansonsten kann ich nur sagen, dass meine Kristallkugel bei diesem *?)/"%&-Wetter nicht funktioniert...zuviele atmosphärische Störungen...

_________________
We are, we were and will not be.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Do 24.06.04 16:11 
Moin!

Gausi hats schon angedeutet: Eine TImageList hält die Bilder intern verlustfrei in einm grossen Bitmap wo die Einzelbilder einfach nacheinander aufgereiht werden. Daher werden eingeladene, komprimierte Bilder entpackt und dann in der ImageList gespeichert. Daher wird der grosse Speicherverbrauch kommen.

MfG
Muetze1
DJ Raptor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
D2005
BeitragVerfasst: Do 24.06.04 17:29 
ok, das erklärt dann schon mal einiges. Es handelt sich in der Tat in erster Linie um JPEG Bilder. Die Komponente der graphics32 Library speichert die geladenen Bilder jedoch jeweils als eigenständiges Bitmap ab und nicht als ein Großes wie bei der originalen imageList. Welche Möglichkeit gibt es denn die Bilder in komprimierter Form in eine imageList bzw. in den Speicher zu laden damit ich diese verzögerungsfrei anzeigen kann. Hab schon nach alternativen imageList Komponenten gesucht aber leider nix gefunden. Bin nach wie vor für jeden Tip dankbar ...
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Do 24.06.04 18:02 
Moin!

Naja, verzögerungsfrei sind die JPEGs nicht, da sie erstmal dekomprimiert werden müssen und zum Teil braucht er dazu mehr Durchläufe...

Ansonsten: die Bitmaps sind schon reine Pixeldaten, ergo: warum lässt du es nicht so?

MfG
Muetze1
DJ Raptor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
D2005
BeitragVerfasst: Do 24.06.04 18:09 
naja das dekomprimieren wird aber vermutlich nicht so lange dauern wie das laden von platte sobald die datei benötigt wird. wenn ich es so lasse habe ich eben eine auslastung die jenseits der schmerzgrenze ist. das beispiel mit 23 jpgs hat ja schon 170 MB. Die Größenordnung von über 100 Bildern kannst Du dir dann sicher vorstellen. Das Ergebniss war ein Rechner der eine Reaktionzeit von ca 5 Minuten pro Eingabe hat und eine Auslagerungsdatei von einigen GB dank überfülltem RAM. Es muss doch Möglich sein die Dateien so wie Sie sind, im Beispiel also 9 MB, in den Arbeitsspeicher zu laden so das ich wie zB bei ACDSee eine Verzögerungsfreie Darstellung habe.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Do 24.06.04 18:14 
Moin!

Dann lade sie von Platte, da die paar kB zum laden nicht auffallen...

Ansonsten musst du bei ACDSee bedenken, das die Jungs optimiert haben ohne Ende...

MfG
Muetze1
DJ Raptor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
D2005
BeitragVerfasst: Do 24.06.04 18:39 
naja wie gesagt, wenn ich es von platte laden wollte hätte ich ja nicht hier gefragt. das funktioniert einwandfrei. aber die eine sekunde verzug die ich habe fürs laden ist mir schon zuviel. im prinzip ist es ein programm für professionelle fotostudios die bereits digital arbeiten. die profi kameras schicken die bilder digital als jpg oder tif per wireless lan an einen rechner. die software soll jetzt eben jedes neu ankommende bild erkennen und für das betrachten nach abschluss aller fotos die dateien im RAM cachen, um anschließend mit dem kunden eine auswahl zu treffen. klappt ja auch alles soweit aber die eine sekunde für das laden des bildes ist mir schon zuviel. das muss doch irgendwie machbar sein.
DJ Raptor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
D2005
BeitragVerfasst: Do 24.06.04 18:42 
naja wie gesagt, wenn ich es von platte laden wollte hätte ich ja nicht hier gefragt. das funktioniert einwandfrei. aber die eine sekunde verzug die ich habe fürs laden ist mir schon zuviel. im prinzip ist es ein programm für professionelle fotostudios die bereits digital arbeiten. die profi kameras schicken die bilder digital als jpg oder tif per wireless lan an einen rechner. die software soll jetzt eben jedes neu ankommende bild erkennen und für das betrachten nach abschluss aller fotos die dateien im RAM cachen, um anschließend mit dem kunden eine auswahl zu treffen. klappt ja auch alles soweit aber die eine sekunde für das laden des bildes ist mir schon zuviel. das muss doch irgendwie machbar sein.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 24.06.04 19:08 
Ne Idee: (So macht IMHO auch ACDSee das schnelle Anzeigen)
Wenn ein Bild geladen und angezeigt wurde, dann lade schon das nächste und pack es in den Speicher. Dieses kannst du dann bei dem entsprechenden Befehl "Zeige Nächstes Bild" fast ohne Verzögerung ausm Speicher laden und dann, während der User das Bild betrachtet, wieder das nächste laden...
Und für ne Übersicht über alle Bilder reichen ja wohl Thumbnails, also stark verkleinerte Versionen der Bilder. Diese musst du einmal erzeugen, und in einer Art Datenbank speichern, aus denen man diese dann schnell lesen kann...

_________________
We are, we were and will not be.
Sven
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 314


D6 Ent, K3 Pro (patched)
BeitragVerfasst: Fr 25.06.04 07:21 
Warum erzeugst Du nicht für jedes Bild einen Stream?. Dieser hat nach dem Laden nur die Größe, wie die Datei sie auf der Platte hatte. Die Daten sind dann gleich im Speicher und dann fällt das Dekomprimieren nicht auf.

_________________
MDK 9.1, Kernel 2.4.21, KDE 3.1 Kylix 3 Pro (patched), nutze aber auch Windows
DJ Raptor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
D2005
BeitragVerfasst: Fr 25.06.04 09:31 
das klingt nach einer guten alternative. hab leider noch nie mit streams gearbeitet. wie muss ich diesen denn erstellen bzw. abrufen?? Nachfolgend mal so wie es bisher funktioniert:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.listViewThumbsCacheItemAdd(
  Sender: TCustomVirtualExplorerListviewEx; NS: TNamespace;
  Thumbnail: TBitmap; var ImageWidth, ImageHeight: Integer;
  var DoDefault: Boolean);
  begin
    loadProgress.Visible := true;
    Application.ProcessMessages;
    if cfgCacheFiles.Checked = true then imageList.Bitmaps.Add.Bitmap.LoadFromFile(NS.NameForParsing);
    I:=I+1;
    loadProgress.Max := listView.TotalCount;
    loadProgress.Position := I;
    Label1.Caption:=inttostr(I)+'/'+inttostr(listView.TotalCount);
    if I = loadProgress.Max then loadProgress.Visible := false;
end;


Also entscheidend ist quasi Zeile 8. Wie muss ich hier den Code ändern um in einen Stream zu laden und wie kann ich nachher ein spezielles Bild wieder aus diesem laden?
MartinPb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Fr 25.06.04 10:35 
Du kannst auch eine Objektliste machen und auf diese Weise eine unendliche menge Jpegs in sie laden. Leider hab ich gerade kein Delphi zur Hand und mir fällt der Name nicht ein. Ich glaube es heiß ObjectList oder ListObject oder so in der Art. Das ganze funktioniert in etwa wie StringList und AddObject, nur eben ohne String. Der Vorteil dabei ist, daß du direkt auf die Jpegs zugreifen könntest ohne sie vorher irgendwo zu laden oder extrahieren.

_________________
Gruß
Martin
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Fr 25.06.04 10:45 
Moin!

TObjectList

Grundlegend kann er anstatt der ImageList auch einfach 100 einzelne TImage's nehmen, das wird dann aber auf das gleiche hinauslaufen. Und nebenbei noch zu Resourcenknappheit bei den Windowsen ohne dynamische GDI Speicherverwaltung führen (Win9x, ME).

MfG
Muetze1
MartinPb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Fr 25.06.04 10:48 
Ich hab mich wieder erinnert. Es ist TObjectList. Da ich aber gerade kein Delphi zur Verfügung habe kann ich dir kein Beispiel zaubern.

_________________
Gruß
Martin
MartinPb
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 698



BeitragVerfasst: Fr 25.06.04 10:55 
Muetze1 hat folgendes geschrieben:
das wird dann aber auf das gleiche hinauslaufen.


Auf das gleiche wie ImageList? Glaube ich nicht. ImageList arbeitet mit Bitmaps. ObjectList arbeitet nur mit einem Objekt. Dem ist egal ob es Bitmap, Jpeg oder sonstwas ist. Zumindest der Part des gigantischen Speicherverbrauchst wäre erledigt. Die Sache mit Ressourcen wäre was anderes. Könnte stimmen, aber es ist weniger sein Problem, als die des Betriebssystems.

_________________
Gruß
Martin
DJ Raptor Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 24

Win XP
D2005
BeitragVerfasst: Fr 25.06.04 11:04 
hm also noch eine Möglichkeit. Was ist denn nun prinzipiell besser TObjectList oder Stream?? Und irgendwie bräucht ich dann jeweils ein Code Beispiel weil die Delphi Hilfe kann man diesbezüglich total vergessen. Also nochmal damit das Problem klar ist:

Ich benötige eine Möglichkeit Bilddateien in Ihrer Originalgröße in den Speicher zu laden um diese verzögerungsfrei anzeigen zu können.
Muetze1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 346



BeitragVerfasst: Fr 25.06.04 11:10 
Moin!

MartinPb hat folgendes geschrieben:
Auf das gleiche wie ImageList? Glaube ich nicht. ImageList arbeitet mit Bitmaps. ObjectList arbeitet nur mit einem Objekt. Dem ist egal ob es Bitmap, Jpeg oder sonstwas ist. Zumindest der Part des gigantischen Speicherverbrauchst wäre erledigt.


Es geht nicht um die TObjectList sondern um TImage - und daher glaube ich nicht, das es sich mit dem Speicherverbrauch erledigt hat.

MfG
Muetze1
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 25.06.04 11:56 
Zitat:
Ich benötige eine Möglichkeit Bilddateien in Ihrer Originalgröße in den Speicher zu laden um diese verzögerungsfrei anzeigen zu können.

Du willst also die Bilder verzögerungsfrei anzeigen lassen. Aber wieso muss man dann ALLE Bilder in dem Ordner in den Speicher lesen? Das ist doch Quatsch.

Wenn ich das Bild "aaaa1.jpeg" anzeige, dann ist es doch nicht erforderlich, dass man dann auch das Bild "zzz9.jpg" schon im Speicher hat. Es reicht doch, wenn man nur das nächste, zu dem man per Tastendruck springen kann, im Speicher hat, oder nicht? Und das laden des jeweils nächsten Bildes kann erfolgen, während der User das gerade angezeigt studiert -> Keine Verzögerungszeiten, es sei denn, man macht ne Daumenkino-Slideshow mit 20 Bilder pro Sekunde...

Wenn ich ein Slide-Show Programm finde, was bei Programmstart oder Ordnerwechsel erstmal alle Bilder in den Speicher liest...dann schmeiß ich das wieder von der Platte runter. Ich möchte nämlich nicht 10 Sekunden warten, bis ich das Programm benutzen kann...

_________________
We are, we were and will not be.