Autor |
Beitrag |
Terra
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: Mo 30.05.05 16:30
Da binnich wieder
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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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
      
Beiträge: 827
|
Verfasst: 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
Alstar
|
|
jaenicke
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 30.05.05 17:04
Alstar 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 |
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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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
      
Beiträge: 126
WIN 2000
D7 Enterprise
|
Verfasst: 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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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.
Wenns jetzt keiner verstanden hat ist auch egal. Hauptsache ich weiß, was ich will
In erster Linie gehts ja auch darum die Speicherauslastung so gering wie möglich zu halten.
Terra
|
|
NCortex
      
Beiträge: 126
WIN 2000
D7 Enterprise
|
Verfasst: 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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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
      
Beiträge: 19314
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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  , 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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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
      
Beiträge: 268
XP
BDS 2006 Prof
|
Verfasst: 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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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
      
Beiträge: 268
XP
BDS 2006 Prof
|
Verfasst: 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 
      
Beiträge: 307
Windows 7 Ultimate
Delphi® XE3
|
Verfasst: 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
      
Beiträge: 268
XP
BDS 2006 Prof
|
Verfasst: 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.
|
|