Décoder JPEG pour obtenir des données non compressées
Question
Je souhaite décoder les fichiers JPEG et obtenir une sortie décodée non compressée au format BMP / RGB. J'utilise GNU / Linux et C / C ++.
J'ai jeté un œil à libjpeg, mais il ne semblait pas y avoir de bonne documentation disponible. Mes questions sont donc les suivantes:
- Où se trouve la documentation sur libjpeg?
- Pouvez-vous suggérer d'autres bibliothèques de décompression JPEG au format C?
La solution
La documentation de libjpeg est fournie avec le code source. Puisque vous ne l'avez pas encore trouvé:
Téléchargez l'archive de code source et ouvrez le fichier libjpeg.doc . C'est un fichier ASCII ordinaire, pas un document Word, alors ouvrez-le bien dans le bloc-notes ou un autre éditeur ASCII.
Il existe également d’autres fichiers .doc. La plupart d'entre eux ne sont toutefois pas très intéressants.
Malheureusement, je ne peux pas recommander d'autre bibliothèque que libjpeg. J'ai essayé plusieurs solutions, mais Libjpeg a toujours gagné. Est-ce assez facile de travailler avec une fois que vous avez fait les bases. C'est aussi la bibliothèque jpeg la plus complète et la plus stable.
Autres conseils
MagickWand est l’API C pour ImageMagick:
http://imagemagick.org/script/magick-wand.php
Je ne l'ai pas utilisé, mais la documentation semble assez volumineuse.
Vous devriez vérifier QImage de Qt. Il a une interface assez facile qui rend cette tâche très facile. La configuration est assez simple pour chaque plate-forme.
Si Qt est excessif, vous pouvez essayer Magick ++ http://www.imagemagick.org/Magick++/ / a>. Il prend en charge des opérations similaires et convient également à ce type de tâche. La dernière fois que je l’ai utilisé, j’ai eu quelques difficultés avec les dépendances sous Windows, mais je ne me souviens pas trop de problèmes sous Linux.
Pour la classe Image de Magick ++, la fonction que vous voulez probablement est getConstPixels.
J'ai du code que vous pouvez copier (ou simplement utiliser comme référence) pour charger une image jpeg à l'aide de la bibliothèque libjpeg.
Vous pouvez parcourir le code ici: http://code.google .com / p / kgui / source / parcourir / trunk / kguiimage.cpp
Recherchez simplement la fonction LoadJPGImage .
Le code est configuré pour gérer la liaison c ++ de ma classe DataHandle à celle-ci lors du chargement de l'image. Ainsi, l'image peut être un fichier ou des données déjà en mémoire ou autre.
Une solution légèrement prête à l'emploi consiste à acquérir une copie des outils netpbm , qui permettent de transformer des images. de pratiquement tous les formats à n’importe quel autre format, en passant par un de plusieurs formats intermédiaires très simples. Ils fonctionnent bien à partir du shell et sont le plus souvent utilisés dans les pipes pour lire des images arbitraires, les exécuter et les écrire dans un autre format.
Les formats pbm peuvent être aussi simples qu’un simple en-tête ASCII suivi des données RVB au format ASCII ou binaire. Ils sont censés être assez simples pour utiliser sans nécessiter une bibliothèque à implémenter.
JPEG est pris en charge dans netpbm par les filtres de lecture et d'écriture qui sont implémentés au-dessus de libjpeg.