Welche C-Bibliothek ermöglicht die Skalierung von ginormous Bildern?

8

Betrachten Sie die folgende Datei:

%Vor%

Wie würden Sie das Bild auf eine vernünftige Auflösung skalieren und nicht mehr als 4 GB RAM verwenden?

Zum Beispiel:

%Vor%

Welche C-Bibliothek würde damit umgehen?

Danke!

    
Dave Jarvis 20.07.2010, 00:43
quelle

7 Antworten

4

Ich glaube, libpng hat eine Stream-Schnittstelle. Ich denke, das kann verwendet werden, um Teile des Bildes auf einmal zu lesen. Abhängig von der Bilddatei können Sie die Zeilen in der richtigen Reihenfolge finden. Sie könnten dann jede Zeile verkleinern (z. B. um 50% verkleinern, die Zeile horizontal verkleinern und jede zweite Zeile verwerfen) und in eine Ausgabedatei schreiben.

Die Verwendung von libpng in C kann ziemlich viel Code erfordern, aber die Dokumentation führt Sie ziemlich gut durch.

Ссылка

    
Edmund 20.07.2010, 01:15
quelle
1

Sie könnten versuchen, einen 64-Bit-Build von ImageMagick zu erstellen oder zu sehen, ob es einen gibt. Mein Kollege hat einen Blog mit einem super-einfachen PNG-Dekoder geschrieben (nimmt an, dass du zlib oder ähnliches hast), damit du den Code sehen kannst, den du selbst rollen musst.

Ссылка

Sie müssten das Resampling beim Einlesen durchführen.

    
Lou Franco 20.07.2010 01:21
quelle
1

Ich habe vor ein paar Jahren cximage benutzt. Ich denke die neueste Version ist bei Ссылка nach dem Verschieben von CodeProject.

Bearbeiten: Entschuldigung, es ist C ++ nicht C.

    
Windows programmer 20.07.2010 01:56
quelle
1

Sie könnten eine Bildverarbeitungsbibliothek verwenden, die komplexe Operationen mit großen (und kleinen) Bildern durchführen soll. Ein Beispiel ist das IM-Imaging-Toolkit . Es verbindet sich gut mit C (ist aber zumindest teilweise in C ++ implementiert) und hat eine gute Bindung zu Lua. Von der Lua-Bindung sollte es einfach zu experimentieren sein.

    
RBerteig 20.07.2010 02:34
quelle
1

libvips fühlt sich mit riesigen Bildern wohl. Es ist eine Streaming-Bildverarbeitungsbibliothek, so dass es gleichzeitig und parallel von der Quelle lesen, verarbeiten und auf das Ziel schreiben kann. Es ist in der Regel 3x bis 5x schneller als ImageMagick und benötigt sehr wenig Speicher.

Zum Beispiel, mit dem größten PNG, den ich auf meinem Laptop habe (1,8 GB), kann ich 10x verkleinern mit:

%Vor%

Nicht schnell, aber auch nicht zu schäbig. PNG ist eher ein langsames Format, es wäre viel schneller mit TIFF.

libvips kann von den meisten Paketmanagern installiert werden (zB homebrew auf macOS, apt auf Debian), gibt es eine Windows-Binärdatei und es ist kostenlos (LGPL). Neben der Kommandozeile gibt es Bindings für C, C ++, Python, Ruby, Lua, Knoten, PHP und andere.

    
user894763 19.02.2018 10:18
quelle
0

Haben Sie daran gedacht, Bilder auf Pyramidenbasis zu untersuchen? Stellen Sie sich eine Pyramide vor, in der das Bild in mehrere Ebenen aufgeteilt ist, wobei jede Ebene eine andere Auflösung hat. Jede Ebene ist in Kacheln aufgeteilt. Auf diese Weise können Sie eine gezoomte Version des Bildes und eine gezoomte Teilansicht des Bildes anzeigen, ohne sie neu skalieren zu müssen.

Siehe den Wikipedia-Eintrag .

Eines der ursprünglichen Formate war FlashPix, für das ich einen Renderer geschrieben habe. Ich habe auch ein neues Format eines Pyramidenkonverters und Renderers erstellt, das für eine medizinische Anwendung verwendet wurde. Ein tatsächlicher Scanner würde 90 GB + Scans einer Scheibe eines Organs für die Krebsforschung erzeugen. Der Algorithmus des Konverters war eigentlich ziemlich schwierig, effizient zu werden, um die Pyramidenbilder effizient zu erzeugen. Glauben Sie es oder nicht, es war tatsächlich Java-basiert, und es hat viel besser funktioniert, als Sie denken. Es verwendete Multithreading. Benchmarking zeigte, dass es unwahrscheinlich ist, dass eine C-Version viel besser wäre. Das war vor 6 Jahren. Der ursprüngliche Renderer, den ich vor über 10 Jahren gemacht habe. Von Pyramidenbildern hört man heutzutage nichts mehr. Aber es ist wirklich die einzige effiziente Möglichkeit, skalierte Bilder bei Bedarf zu erzeugen, ohne zwischengespeicherte skalierte Versionen erzeugen zu müssen.

Jpeg2000 kann auch eine optionale Pyramidenfunktion haben oder nicht.

Ich erinnere mich, dass ImageMagicks Unterstützerformate und -konvertierungen vielleicht FlashPix enthalten. Googeln nach "Bildpyramide" zeigt einige interessante Ergebnisse. Bring ein paar Erinnerungen zurück; -)

    
Mike 20.07.2010 03:19
quelle
0

Wenn Sie es auf ein 64-Bit-Betriebssystem verschieben können, können Sie es als eine Speicherabbilddatei oder gleichwertig öffnen und so ziemlich jede Bibliothek verwenden, die Sie möchten. Es wird nicht schnell sein und möglicherweise die Seiten- / Auslagerungsdatei erhöhen (abhängig vom Betriebssystem und was Sie sonst noch damit machen wollen), aber dafür sind Sie nicht darauf beschränkt, Bibliotheken zu streamen in der Lage, mehr Operationen durchzuführen, bevor die Auflösung oder das Slicing reduziert wird.

    
ZXX 08.08.2010 15:03
quelle

Tags und Links