PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Grosses Bild splitten in Java


Berni
2013-02-24, 23:13:25
Ich suche nach einer Möglichkeit, in Java ein richtig großes Bild (PNG) in mehrere kleine zu splitten ohne dabei Unmengen an RAM zu brauchen (also nicht einfach das Ursprungsbild komplett in den RAM laden). Ist das irgendwie möglich? Wenn ihr abseits von Java was kennt bin ich auch erstmal offen dafür.

Milchkanne
2013-02-25, 10:16:41
Ich kenne keine Bibliothek, was so eine Funktion bietet.
Wenn das PNG mit Vorfiltern komprimiert wurde, wird es schon etwas komplizierter. Dann muss man immer den Rand von dem vorhergehenden Block/Zeile noch speichern um den nächsten Block zu dekodieren...
Ein interessantes Projekt wäre das dennoch.

Coda
2013-02-25, 11:27:16
Das geht allein deshalb schon nicht, weil es ein einziger zlib stream ist im PNG für das ganze Bild, den du nicht irgendwo in der Mitte anfangen kannst zu dekodieren.

PatkIllA
2013-02-25, 16:02:54
Das geht allein deshalb schon nicht, weil es ein einziger zlib stream ist im PNG für das ganze Bild, den du nicht irgendwo in der Mitte anfangen kannst zu dekodieren.
Wie kriegen es denn dann die 32 Bit Programme hin ein PNG zu laden was rein rechnerisch gar nicht in den Adressraum passt?
Decoden kann man es ja, und dann die nicht genutzten Daten verwerfen. Ist vielleicht nicht das schnellste aber immerhin würde es gehen, wennn das Bild ansonsten erst gar nicht in den Speicher passt.
Das ist nämlich mein Problem: http://www.forum-3dcenter.org/vbulletin/showthread.php?t=538922

minos5000
2013-02-25, 16:22:13
Wie kriegen es denn dann die 32 Bit Programme hin ein PNG zu laden was rein rechnerisch gar nicht in den Adressraum passt?

Das Programm könnte ja den Inhalt des Bildes erstmal entpackt auf der Platte ablegen und dann erst das eigentliche Laden übernehmen.

Coda
2013-02-25, 23:14:57
Wie kriegen es denn dann die 32 Bit Programme hin ein PNG zu laden was rein rechnerisch gar nicht in den Adressraum passt?
Disk Cache.

Also muss ich mich dann natürlich korrigieren. Man kann natürlich zuerst auf die Disk dekomprimieren, das geht auch mit wenig RAM. Und dann daraus die Blöcke lesen.

Ich hab sowas sogar schonmal nur mit Tools gemacht. Imagemagik oder son Quark.

Nighthawk13
2013-02-26, 16:59:42
Evtl. geht das partielle Laden ja doch. Kommentar in "nothings.org/stb_image.c":
// a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead

Im Prinzip müsste es doch möglich sein, sich durch alle Chunks durchzuhangeln und nur die relevanten Pixel (für den Zielbereich) in den Speicher zu schreiben.

Coda
2013-02-26, 19:58:38
Dafür musst du trotzdem alles bis zu diesem Punkt im Speicher haben. Schau mal genau, was die Funktion macht.

Berni
2013-02-27, 09:16:11
Kann man es denn dekodieren als Bitmap und darauf effizient operieren?

Ich habe zwischenzeitlich mal Imagemagick probiert mit einem Bild mit 30000x30000 Pixel ein Thumbnail zu erstellen: Das Programm erstellt erstmal eine 8GB-Temp-Datei (hatte eher mit um die 4GB gerechnet was eigtl. sogar in den RAM passen müsste noch) und schreibt da munter Daten mit 100MB/s rein. Dann geht plötzlich das Seeken los: Die Disk ist voll ausgelastet bei 1MB/s, CPU fast gar nicht. Und dann braucht das Programm über ne halbe Stunde um ein Thumbnail zu erstellen was meiner Meinung nach viel zu lang ist, denn der Explorer von Windows 7 kann das Thumbnail in etwa ner Minute erstellen (wie auch immer das es anstellt).
Das Splitten desselben Bildes (um das gings hier ja primär aber Verkleinern bräuchte ich später auch mal) hatte ich nach ner DreiviertelStunde abgebrochen ohne dass auch nur eine gesplittete Datei erzeugt wurde. Keine Ahnung was das Programm da die ganze Zeit treibt...