2010-07-20 13 views
8

Si consideri il seguente file:Quale libreria C consente di ridimensionare le immagini ginormous?

-rw-r--r-- 1 user user 470886479 2009-12-15 08:26 the_known_universe.png 

Come ti scalare l'immagine fino a una risoluzione ragionevole, utilizzando non più di 4GB di RAM?

Ad esempio:

$ convert -scale 7666x3833 the_known_universe.png 

Cosa libreria C potrebbe gestire la cosa?

Grazie!

+2

Ridefinire l'universo conosciuto per adattarsi all'interno di una regione sferoidale di settecentocinque metri di diametro. La mappa sarà molto più piccola e più facile da manipolare. –

+0

Mi stavo solo chiedendo, hai provato a farlo con ImageMagick? Se non sbaglio, puoi digitare praticamente quel comando esatto se lo hai installato, anche se immagino che ImageMagick non sarà in grado di gestirlo. –

+1

'convert' * è * ImageMagick –

risposta

4

Credo che libpng abbia un'interfaccia di flusso. Penso che questo possa essere usato per leggere parti dell'immagine alla volta; a seconda del file immagine potresti essere in grado di ottenere le linee in ordine. Potresti quindi restringere ogni linea (ad es. Per il restringimento del 50%, restringere la linea orizzontalmente e scartare ogni seconda riga) e scrivere su un file di output.

L'uso di libpng in C può richiedere una buona quantità di codice, ma la documentazione vi guida abbastanza bene.

http://www.libpng.org/pub/png/libpng-1.2.5-manual.html#section-3.8

+0

+1: questa è la strada da percorrere. Ho dovuto fare qualcosa di simile con l'immagine della NASA e ho usato l'API di streaming – Anon

1

Si potrebbe provare a fare un po '64 build di ImageMagick o di vedere se ce n'è uno. Il mio collega ha scritto un blog con un decoder png super-semplice (si presuppone che tu abbia zlib o equivalente) in modo da poter vedere il codice di cui avresti bisogno per girare il tuo.

http://www.atalasoft.com/cs/blogs/stevehawley/archive/2010/02/23/libpng-you-re-doing-it-wrong.aspx

Si avrebbe bisogno di fare il resample come si sta leggendo in.

+0

Devi anche assicurarti di compilare con 8 bit per canale. – Gabe

1

ho cximage usato qualche anno fa. Penso che l'ultima versione sia a http://www.xdp.it/cximage.htm dopo essere uscito da CodeProject.

Edit: mi dispiace, è C++ non C.

1

Si potrebbe utilizzare una libreria di elaborazione delle immagini che è destinato a fare operazioni complesse su grandi (e piccole) immagini. Un esempio è il IM imaging toolkit. Si collega bene con C (ma è implementato almeno in parte in C++) e ha un buon legame con Lua. Dal binding Lua dovrebbe essere facile sperimentare.

0

Avete considerato l'esplorazione di immagini basate su piramide? Immagina una piramide in cui l'immagine è divisa in più livelli, ogni livello con una risoluzione diversa. Ogni livello è suddiviso in tessere. In questo modo è possibile visualizzare una versione ingrandita dell'immagine e anche una visualizzazione parziale ingrandita dell'immagine, senza dover ridimensionare.

Vedere Wikipedia entry.

Uno dei formati originali era FlashPix, su cui ho scritto un renderer. Ho anche creato un nuovo formato di un convertitore piramidale e un renderer, che è stato utilizzato per un'applicazione medica. Uno scanner effettivo produrrebbe scansioni da 90 GB + di una fetta di un organo per la ricerca sul cancro. L'algoritmo del convertitore era in realtà piuttosto difficile da ottenere efficiente, per produrre efficientemente le immagini della piramide. Che ci crediate o no, in realtà era basato su Java, e ha funzionato molto meglio di quanto pensiate. Ha usato il multithreading. Il benchmarking ha dimostrato che era improbabile che una versione C avrebbe funzionato molto meglio. Questo è stato 6 anni fa. Il renderer originale che ho fatto più di 10 anni fa. Attualmente non si sente più nulla sulle immagini basate su piramide.Ma è davvero l'unico modo efficace per produrre immagini scalate su richiesta senza dover generare versioni scalate in cache.

Jpeg2000 può o meno avere una funzione piramide opzionale.

Mi ricordo che i formati e le conversioni di supporter di ImageMagick includono forse FlashPix. Googling per "piramide di immagini" rivela alcuni risultati interessanti. Riporta alcuni ricordi ;-)

0

Se è possibile spostarlo in un sistema operativo a 64 bit, è possibile aprirlo come file mappato in memoria o equivalente e utilizzare praticamente qualsiasi libreria desiderata. Non sarà veloce e potrebbe richiedere l'aumento del file page/swap (a seconda del sistema operativo e di quello che vuoi fare con esso), ma in cambio non sarai limitato alle librerie di streaming, quindi sarai in grado di fare più operazioni prima di andare in riduzione della risoluzione o affettare.

0

libvips è comodo con immagini enormi. È una libreria di elaborazione delle immagini in streaming, quindi può leggere dall'origine, elaborare e scrivere sulla destinazione contemporaneamente e in parallelo. In genere è da 3 a 5 volte più veloce di imagemagick e ha bisogno di pochissima memoria.

Ad esempio, con la più grande PNG che ho sul mio portatile (1,8 GB), posso ridimensionare 10x con:

$ vipsheader huge.png 
huge.png: 72000x72000 uchar, 3 bands, srgb, pngload 
$ ls -l huge.png 
-rw-r--r-- 1 john john 1785845477 Feb 19 09:39 huge.png 
$ time vips resize huge.png x.png 0.1 
real 1m35.279s 
user 1m49.178s 
sys 0m1.208s 
peak RES 230mb 

Non veloce, ma non troppo malandato neanche. PNG è piuttosto un formato lento, sarebbe molto più veloce con TIFF.

libvips è installabile dalla maggior parte dei gestori di pacchetti (ad esempio homebrew su macOS, apt su Debian), there's a Windows binary ed è gratuito (LGPL). Oltre alla riga di comando, esistono collegamenti per C, C++, Python, Ruby, Lua, node, PHP e altri.

Problemi correlati