8
votes

Quelle bibliothèque C permet une mise à l'échelle d'images ginormes?

Considérez le fichier suivant:

$ convert -scale 7666x3833 the_known_universe.png


3 commentaires

Redéfinissez l'univers connu pour s'adapter à une région sphéroïde entre sept cent cinq mètres de diamètre. La carte sera beaucoup plus petite et plus facile à manipuler.


Vous vous demandez simplement, avez-vous essayé de faire cela avec ImageMagick? Si je ne me trompe pas, vous pouvez taper à peu près cette commande exacte si vous l'avez installé, bien que je devine que ImageMagick ne soit pas capable de le gérer.


@Dave Jarvis: Peut-être que votre temps serait mieux passé à chercher des choses. Choses dont tu as besoin. Des choses qui vous font partir.


7 Réponses :


4
votes

Je pense que libpng a une interface de flux. Je pense que cela peut être utilisé pour lire des parties de l'image à la fois; Selon le fichier image, vous pourrez peut-être obtenir les lignes dans l'ordre. Vous pouvez ensuite rétrécir chaque ligne (par exemple pour une rétrécissement de 50%, rétrécissez la ligne horizontalement et jetez chaque deuxième ligne) et écrivez dans un fichier de sortie.

Utiliser libpng in c peut prendre une bonne quantité de code, mais la documentation vous guide tout à fait.

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


1 commentaires

+1 - C'est la voie à suivre. Je devais faire quelque chose de similaire avec l'image de la NASA et j'ai utilisé l'API Streaming



1
votes

Vous pouvez essayer de créer une construction de 64 bits d'imagemagick ou de voir s'il y en a un. Mon collègue a écrit un blog avec un décodeur PNG super simple (suppose que vous avez des zlib ou équivalent) afin que vous puissiez voir le code que vous auriez besoin de rouler votre propre.

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

Vous auriez besoin de faire le rééchantillon comme vous le lisez.


1 commentaires

Vous devez également vous assurer de compiler avec 8 bits par canal.



1
votes

J'ai utilisé CxImage il y a quelques années. Je pense que la dernière version est à http://www.xdp.it/cxImage.htm Après avoir déménagé de codeProject.

Edit: Désolé, c'est c ++ pas c.


0 commentaires

1
votes

Vous pouvez utiliser une bibliothèque de traitement d'image destinée à faire des opérations complexes sur de grandes images (et de petites) images. Un exemple est le Toolkit d'imagerie IM . Il relie bien avec C (mais est mis en œuvre au moins partiellement en C ++) et a une bonne liaison à Lua. De la liaison Lua, il devrait être facile d'expérimenter.


0 commentaires

0
votes

Avez-vous envisagé d'explorer des images basées sur la pyramide? Imaginez une pyramide où l'image est divisée en plusieurs couches, chaque couche avec une résolution différente. Chaque couche est divisée en tuiles. De cette façon, vous pouvez afficher une version zoomée de l'image, ainsi qu'un zoom sur la vue partielle de l'image, sans avoir à se réorganiser.

Voir le Entrée Wikipedia .

L'un des formats d'origine était FlashPix, que j'ai écrit un rendu pour. J'ai également créé un nouveau format d'un convertisseur pyramide et de rendu, utilisé pour une application médicale. Un scanner réel produirait 90 Go + des analyses d'une tranche d'un organe pour la recherche sur le cancer. L'algorithme du convertisseur était en fait assez délicat pour devenir efficace pour produire les images pyramides de l'efficacité. Croyez-le ou non, c'était en fait Java basé, et cela a bien fonctionné que vous ne le pensez. Il a utilisé de multithreading. La benchmarking a montré qu'il était peu probable qu'une version C fasse beaucoup mieux. C'était il y a 6 ans. Le rendu d'origine que j'ai fait il y a plus de 10 ans. Vous n'entendez plus rien des images basées sur la pyramide ces jours-ci. Mais c'est vraiment le seul moyen efficace de produire des images à l'échelle à la demande sans avoir à générer des versions mises en cache.

JPEG2000 peut également avoir une fonctionnalité pyramide en option également.

Je me souviens que des formats et des conversions de supporters de l'imagemagick peuvent peut-être, incluent FlashPix. Googling for "Image Pyramid" révèle des résultats intéressants. Ramener quelques souvenirs; -)


0 commentaires

0
votes

Si vous pouvez le déplacer dans un système d'exploitation 64 bits, vous pouvez l'ouvrir sous forme de fichier mappé de mémoire ou équivalent et utilisez à peu près toute bibliothèque que vous souhaitez. Il ne sera pas rapide et peut avoir besoin de l'augmentation du fichier de page / swap (selon le système d'exploitation et de ce que vous voulez en faire d'autre) mais en retour, vous ne serez pas limité aux bibliothèques en streaming, vous serez donc capable de faire plus de fonctionnement avant d'entrer dans la résolution ou la découpage.


0 commentaires

1
votes

libvivips est à l'aise avec d'énormes images. C'est une bibliothèque de traitement d'image en streaming, de sorte qu'il peut lire à partir de la source, du processus et d'écrire à la destination simultanément et en parallèle. Il est généralement 3x à 5 fois plus vite que l'imagemagick et a besoin de très peu de mémoire.

Par exemple, avec le plus grand PNG que j'ai sur mon ordinateur portable (1,8 Go), je peux réduire 10x avec: P>

$ 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


0 commentaires