Autor Beitrag
Terra
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 16:30 
Da binnich wieder :D

Erstelle grade ein Programm wo in der mitte ein Fenster ist in dem ein ausschnitt eines JPG Bildes dargestellt wird das gesammt 8000x5000 Pixel groß ist. Kann dann innerhalb dieses Fensters mittels Sliders verschoben werden.
Interesserhalber schaute ich mal im Task-Manager wieviel Speicher das Programm mit Bild verbraucht und es kamen erschreckende 160MB zum vorschein.

Das Programm soll später mal für andere auch zugänglich gemacht werden. Daher meine Frage. Wie bekomm ich es hin das das gleiche Prinziep mit weniger Speicher hinbekomme? ... Das Bild in viele kleine zerschnibbeln wäre ja nicht das Problem .. nur wie stell ich das dann als einzelnes wieder dar? Vorallem, so das ich es danach auch von einer Ecke zur anderen verschieben kann. Und vorallem ist dann die Frage: Bringt das überhaupt was ?

Problem an der ganzen Sache ist halt, das ich die Qualität des Bildes nicht weiter optimieren kann so das die Datei selber bissel kleiner wird. Die JPG-Datei ist 7MB groß.

Für ne hilfe wäre ich dankbar.

MfG. Terra
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 30.05.05 16:43 
Also wenn deine JPG-Datei nur 7 MB groß ist, dann liegt die Menge an Arbeitsspeicher nicht direkt daran.
Ich vermute, dass bei der Anzeige des Bildes Bitmaps verwendet werden, auch wenn du von der Umwandlung nichts mitbekommst und die sind nunmal viel größer, denn in JPG-Dateien werden IMMER 16 Millionen Farben verwendet.

Mein Vorschlag: Versuchs mal mit einer BMP, die auf 16 Farben reduziert ist oder, falls das nicht reicht, auf 256.
Dann wird zwar dein Programm größer aber dafür ist der Speicherverbrauch nicht mehr so hoch (nehme ich an).

Vorschlagen würde ich das Bild in komprimiertem Format zu includen, dann nimmt es nicht so viel Platz weg.
Wie das geht, kann ich auch noch sagen, falls mein Tipp das Problem löst.
Alstar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 827



BeitragVerfasst: Mo 30.05.05 16:53 
Du köntest natürlich versuchen nur genau den Ausschnitt des Bildes zu zeichnen, das auch angezeigt wird. Aber wie genau du das machen kannst, weiß ich auch nicht :oops:

Alstar
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 30.05.05 17:04 
user profile iconAlstar hat folgendes geschrieben:
Du köntest natürlich versuchen nur genau den Ausschnitt des Bildes zu zeichnen, das auch angezeigt wird. Aber wie genau du das machen kannst, weiß ich auch nicht :oops:

Na ja, wie man das macht, weiß ich schon, aber der Haken daran ist derselbe, den ich gerade beschrieben habe. Zur Anzeige und so muss mit BMP-Daten, nämlich mit unkomprimierten Daten, gearbeitet werden.

Zur Anzeige eines Ausschnittes kann man dann BitBlt benutzen, aber dafür muss man im Hintergrund dennoch das gesamte Bild laden.
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 17:04 
Zitat:
Mein Vorschlag: Versuchs mal mit einer BMP, die auf 16 Farben reduziert ist oder, falls das nicht reicht, auf 256.


Das Bild habe ich bereits auf 256 Farben runtergeschraubt. Habe das Bild mittels TImage eingeladen. War wohl nicht so klug. Jetzt hab ich aber grade gelesen, das es mittels TObjectList besser gehen soll. Ist das keine Komponente? Finde es zumindest nicht. Wie müsste man denn da vorgehen?

bissel Quelltext wäre nett weil ich aus den anderen Kram absolut net schlau werde. :-(

Terra
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 30.05.05 17:17 
Du hast es schon auf 256 Farben? Ich dachte das geht mit JPG gar nicht, weil das für Fotos gedacht war. Kann es sein, dass es beim Speichern doch wieder auf 16 Millionen Farben hochgeschraubt wurde, weil dieses Format benutzt wurde?
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 17:25 
Ne, ist immer noch 256 Farben ... hab es mit IrfanView gemacht .. damit klappt das ganz gut.

Jetzt hab ich mal dein Vorschlag probiert eine 256 Farben BMP-Datei in das Projekt zu laden. Soweit ok nur beim Complimieren hängt sich Delphi auf. Anscheinend ist eine 45MB große Datei doch bissel zu viel.

Kannst du mir vielleicht mit dem TObjektList weiterhelfen? Finde in der hinsicht nichts brauchbares.

Terra
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mo 30.05.05 17:38 
Na ja, was ne ObjectList ist, weiß ich schon, nur weiß ich nicht, wie die hier helfen soll...

Ich werd mal zu Hause versuchen ein Bild mit den angegebenen Dimensionen möglichst optimal zu behandeln...

Für TObjectList kannst du dir das hier mal ansehen:
www.festra.com/wwwboard/messages/1881.html

Du solltest vielleicht mal angeben woher du das hast, dass ne ObjectList hier helfen kann, vielleicht weiß ich daraus wie das gemeint ist...
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 18:05 
oh klar ... das mit dem TObjektList hab ich hier her: www.delphi-forum.de/...ighlight=tobjectlist
Ist fast das gleiche Problem das ich auch habe nur peil ich net ganz wie die das lösen.

Das Bild ist genau 8027x5978 Pixel groß.

Es ist halt doof, das ich kaum was in Delphi gemacht habe und dieses mein erstes Projekt ist, das ich auch bis zum Schluss bearbeiten möchte. Nur es stellen sich immer wieder Hindernisse in den Weg. Angefangen von der größe der Auslastung im Speicher über kleinigkeiten die ich zwar schon lösungsmäßig gefunden hab aber nicht weiß wie ich die umsetzen soll.

Naja, werde wohl hier öffters Fragen posten .. hoffe nur das es nicht irgendwann aufm Nerv geht.

Terra
NCortex
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 126

WIN 2000
D7 Enterprise
BeitragVerfasst: Mo 30.05.05 18:14 
hast du eine externe jpg datei, die immer nachgeladen wird?

wenn ja, könntest du ja, die datei in verschiede "sektoren" einteilen. zum beipsiel könntest du das Bild in 100 einzelbilder teilen, die dann entsprechen nebeneinander auf deine Form zeichnen, so würde sich immer nur der benötigte teil (plus bissl rand) im speicher befinden.

_________________
"...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 18:23 
oh toll ... jetzt hab ich 2x das gleiche und nirgens wo ein löschen button :?

Also die Image-Datei ist z.Z. noch außerhalb des Projekts .. Sollte aber eigentlich in eine DLL Datei gepackt werden was ich auch noch nicht geschaft habe. (Langsam eine Kriese bekomm). Das Bild ist eine Map von einem Spiel. Darauf sind Gebiete zu sehen. Die Idee war die, halt die Image-Datei in die DLL zu kloppen und gleichzeitig in der DLL die Bereiche mittels Koordinaten positionen zuzuweisen so das man diese Bereiche mit der Maus anwählen kann. :roll:

Wenns jetzt keiner verstanden hat ist auch egal. Hauptsache ich weiß, was ich will :D :D :D

In erster Linie gehts ja auch darum die Speicherauslastung so gering wie möglich zu halten.

Terra
NCortex
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 126

WIN 2000
D7 Enterprise
BeitragVerfasst: Mo 30.05.05 18:38 
wenn du sowieso bereiche machen willst, dann nimm von vornerein tiles, also kleine abschnitte. hier im Forum stand was in sachen wie man mehrere jpg bilder in eine dll packt... schau dir das mal an

_________________
"...by all means, do not use a hammer." (aus einer IBM Technikerdokumentation ca. 1920)
--->außer es kam von Microsoft<---
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Mo 30.05.05 19:01 
Ich sehe, du hast mich nicht verstanden... aber nicht schlimm.

Habe mal ein hochprofessionelles Bild hier reingestellt ^^ um zu veranschaulichen was Sache ist. Nehmen wir mal an das Bild ist mein orginal in gaaaanz klein. Die roten Punkte sollen Städte darstellen die NICHT durch ein koordinatennetz ausgeklammert werden können da diese an beliebigen stellen positioniert sind. Muss also jede Stadt einzeln (x, y, max_x, max_y) herrausfinden und als variable speichern. Aber das ist nicht die schwierigkeit. Ich möchte das Bild als ganzes behalten so das mittels einer Suchfunktion eine beliebige stadt auch "angefahren" werden kann. Also so Autoscroll mäßig, halt nur draufsicht. Wenn ich jetzt alles in einzelne kleine Quadrate hab werd ich total überfordert.

Ach, das mit der DLL hab ich selber gefragt hier im Forum .. nur dummerweise (oder vielleicht auch selbstverständlich) funktionierte es bei mir nicht sondern es kamen viele lustige kleine fehlermeldungen.
www.delphi-forum.de/...+auslesen_42770.html

Terra
Einloggen, um Attachments anzusehen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 31.05.05 14:08 
Also ich hab das mal mit ner Image-Komponente ausprobiert. Mit ner Bitmap und 256 Farben verbraucht das Proggi ungefaehr 40 MB Speicher, bei ner JPG mit 16 Millionen Farben 120 MB.

Deshalb: Ich denke mit ner Bitmap muesste das klappen.

Und ich hab es bei JPG mit keinem Tool, auch nicht mit IrfanView, hinbekommen eine JPG-Datei mit 256 Farben zu erstellen. In der Formatspezifikation steht im uebrigen auch drin, dass nur 16 Millionen unterstuetzt werden, wie ich es gesagt hatte.

Nun und zur TObjectList: Die hat mit deinem Problem mitnichten viel zu tun :roll: , in dem von dir angegebenen Post geht es nicht darum damit den Speicherbedarf von EINEM Bild zu verringern, sondern den von vielen statt dies in einer ImageList zu verwalten...
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Di 31.05.05 14:25 
Zitat:
In der Formatspezifikation steht im uebrigen auch drin, dass nur 16 Millionen unterstuetzt werden

Ja, mit dem JPG Bild und den Farben hab ich mich wirklich vertan .. Und ich war mir so sicher ^^ Asche über mein Haupt.

Zitat:
in dem von dir angegebenen Post geht es nicht darum damit den Speicherbedarf von EINEM Bild zu verringern, sondern den von vielen statt dies in einer ImageList zu verwalten...

Jain. Ich habe es bereits in einem anderen Theard angesprochen. Dieses eine Bild, das so überdimensional groß ist soll aus einer DLL datei geladen werden und in einer Scrollbox angezeigt werden. Wie das genau funktioniert weiß ich noch nicht aber ich bin fleißig am durchstöbern.
Naja, ich bin dann aber nicht ganz sicher ob ImageList damit was zu tun hat weil das Bild mittels Stream geladen werden soll. Rede ich jetzt unsin oder bin ich doch auf den richtigen weg?

Würde natürlich dann auch lieber die BMP Datei nehmen um Speicher einzuspaaren aber ne 45MB große Datei ist einfach mal .... zu groß. Auch wenn ich das Programm dann später komprimiere und dann zum download anbiete ist immer noch 20 MB groß. Im jetzigen Stadium! Und wer weiß, wieviel noch dazu kommt.

Terra
Neidhard von Reuental
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: Di 31.05.05 14:26 
jpg's mit 8 bit sind graustufenbilder. sehr selten verwendet und kaum unterstützt
wenn 256 farben reichen würde ich da auch auf bmp zurück greifen
aber um den speicherverbrauch von 40mb wirst du nicht ohne weiteres herumkommen. das ist nunmal in der bildgröße so.
2 möglichkeiten:
1. das bild verkleinern
oder 2. eine eigene kompo schreiben die beim verschieben das entsprechende bild erstellt und anzeigt. ist meiner meinung nach aber zu aufwendig

//edit:
entweder die 40mb als datei oder 120mb im ram ;) wo is da das kleinere übel
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Di 31.05.05 14:44 
Zitat:
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.

Das ist ein Auszug eines anderen Theard. Verstehe ich das richtig, das die Datei den gleichen Speicherverbrauch hat wie die größe der Datei? Wenn ja, wie geht das?
Der Link zum Theard hab ich weiter oben schonmal aufgeführt. Hing mit dem TObjectList zusammen.

Terra
Neidhard von Reuental
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: Di 31.05.05 14:58 
das würde aber nur bei unkopremierten bildern (bmp) funktionieren.
sobald du ein jpg zur anzeige bringen möchtest wird es automatisch im speicher entpackt und wird wieder 8027x5978x3=143,95MB groß
Terra Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 307

Windows 7 Ultimate
Delphi® XE3
BeitragVerfasst: Di 31.05.05 15:07 
Ich werde wohl erstmal 2 Versionen machen... einmal mit JPG und eine mit BMP. Werde dann mal später schauen was sich besser eignet. Ich hoffe nur, das es zwischen den beiden Formaten nicht allzu viele unterschiede gibt. (sprich beim händeln dieser Dateien)

Trotzdem erstmal ein Dankeschön an alle die versucht haben zu helfen.

Terra
Neidhard von Reuental
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 268

XP
BDS 2006 Prof
BeitragVerfasst: Di 31.05.05 15:30 
wenn du für beides timage benutzt sollte es keine unterschiede geben
solltest du allerdings für bmp TBitmap und für jpg TJPEG benutzen wirst du schon einige unterschiede bemerken ;)

nun aber noch mal zu deiner titelfrage.
wenn dein programm nicht gleichzeitig mit einem spiel läuft wär es mir egal ob es 160mb benötigt. soll allerdings das game und dein karten-programm laufen würde ich die bmp-version vorziehn, allerdings sollten da die 256 farben ausreichen.