Ich arbeite mit extrem großen TIF-Bildern, die ich komponiere, zu einem großen Einzelbild. Ich habe eine Bibliothek, die von einem Kollegen erstellt wurde, der die Bildpyramide generiert und ein sehr praktisches Werkzeug zur Visualisierung der Bildpyramide bietet. Dieser Visualisierer eignet sich hervorragend, um einen Blick auf das große Bild zu werfen und Punkte von Interesse zu erkennen, aber die Kunden sind mehr an einer Bildanalyse dieser großen Bilder interessiert.
Daher ist es notwendig, das sehr große Bild in eine einzige Datei zu exportieren. Ich finde das störend, wenn man bedenkt, dass diese Bilder irgendwo zwischen 800 MB und mehreren GB groß sein können. Und gerade die Aufgabe, dieses einzelne Bild in den Speicher zu laden, ist eine Herausforderung, besonders wenn eine Bildanalyse durchgeführt wird.
Ich frage mich, ob es in Java möglich wäre, dieses große TIFF-Bild blockweise oder zeilenweise zu schreiben. Momentan läuft in meiner Anwendung nicht mehr genügend Arbeitsspeicher auf kleinen (8 GB RAM) Rechnern.
Die aktuelle Methode zum Erstellen dieser Bilder lautet:
-
Speichern Sie die Pixelwerte in BufferedImage
mit WritableRaster
%Vor%
-
Und dann schreiben Sie das gepufferte Bild auf die Festplatte. Für diesen Teil verwende ich ImageJ
, um das Bild als tif zu schreiben. Wenn es bessere Möglichkeiten gibt, 16-Bit-Graustufen-TIF-Bilder zu unterstützen, werde ich mich freuen, einen Blick darauf zu werfen.
%Vor%
Das Problem mit dieser Methode ist, dass es einen zu großen Speicherbedarf für eine 8 GB RAM-Maschine hat.
Idealerweise möchte ich nur ein einziges short[][]pixels
haben. Dies liegt hauptsächlich daran, dass ich eine durchschnittliche Blending-Funktion berechnen muss, so dass ein gewisser Speicherbedarf vorhanden ist. Auch in Zukunft werde ich eine lineare Mischung hinzufügen. Der short[][]pixels
sollte nur ~ 765 MB RAM für 20k x 20k Pixeldaten aufnehmen, was meiner Meinung nach momentan nicht vermeidbar ist. Für größere Bilder, zum Beispiel 100k x 100k Pixel, würde ich hoffen, dass die Biologen das nicht exportieren wollen Bild, da es 18 GB RAM aufnehmen würde.
Später werde ich den Code modifizieren, um den Export der extrem großen Bilder wie 100k x 100k zu unterstützen. Fürs Erste ist es okay, ein Stück Speicher zu verwenden, um die anfänglichen Pixelwerte zu speichern.
Also, was ist eine gute Methode, Teile eines TIF-Bildes auf die Festplatte zu schreiben, damit ich das Schreiben von Kernbildern wie den 100k x 100k-Bildern unterstützen kann.
Ich habe diesen Beitrag gesehen: Schreiben Sie die gekachelte Ausgabe von TIFF mit ImageIO in Java
Aber es behandelt nur die Spezifikation TIFF 6.0. Aber ich werde in ImageOutputStreams
schauen. Tif ist aber ein Biest, also könnte ich nur in den sauren Apfel beißen und die Biologen ermutigen, nur die Regionen von Interesse zu exportieren.
BEARBEITEN:
Eine praktikable Lösung gefunden:
SCHREIBER:
Ссылка
und
LESER:
Ссылка
Hauptgruppen-Seite:
Ссылка