Pouvons-nous changer la taille d'une image JPEG sans décodage ni recodage?


12

Je souhaite convertir une image JPEG 640x480 en 320x240. Je sais que cela peut être fait en décodant l'image JPEG en YCbCr brut, en la mettant à l'échelle et en la recodant en JPEG. Mais est-il possible avec l'encodage JPEG de redimensionner directement l'image sans décodage?

Réponses:


14

Vous pouvez le faire, mais uniquement si votre visionneuse JPEG prend en charge l' extension JPEG SmartScale . jpegtran peut le faire pour des tailles de N / 8, avec N = 1..16. Fondamentalement, la taille du bloc DCT passe de 8x8 à quelque chose d'autre pendant la recompression (par exemple 4x4), ce qui redimensionne efficacement l'image.

Remarque: SmartScale a été introduit dans la version 8 de la bibliothèque libjpeg, mais il n'est pas largement pris en charge par les téléspectateurs.

Un document décrivant les changements en détail peut être trouvé ici: Evolution of JPEG .

EDIT: Il semble que la plupart des téléspectateurs ne peuvent pas réellement afficher ces images, car elles sont basées sur libjpeg-turbo. Et libjpeg-turbo a choisi de ne pas implémenter cette fonctionnalité . En fait, j'ai essayé pas mal de programmes (sur Ubuntu 14.04 et Windows 8) et aucun n'a pu afficher l'image réduite à l'aide de jpegtrans. Même Photoshop, IrfanView et GIMP ont échoué.

EDIT 2: En fait, Ubuntu et Fedora ne livrent même pas la bibliothèque libjpeg8, mais la remplacent complètement par la version libjpeg-turbo. Aucun des programmes ne pourra donc lire les fichiers JPEG SmartScale, à l'exception de quelques fichiers binaires qui sont liés statiquement à la bibliothèque libjpeg8 d'origine.


Existe-t-il un codec qui construit l'image qui se développe simplement en ajoutant d'autres données à l'image?
Necktwi

qu'en est-il du jpeg progressif? N'est-ce pas exactement ce que je demande?
Necktwi

Non, cela fait quelque chose de légèrement différent en augmentant la qualité de l'image (du bas au plein), mais la résolution est toujours inchangée ( référence ). Cependant, il existe une autre extension JPEG appelée "mode hiérarchique", qui code pour différentes résolutions ( voir également ici ). Mais encore une fois, libjpeg-turbo ne le prend pas en charge (voir ici , recherchez "progressif" dans le texte).
jmiserez

1
Et pour répondre au premier commentaire, il existe bien sûr de tels codecs. Mais pas JPG. Ce que vous recherchez s'appelle une pyramide d'images ou une représentation multi-échelles. Par exemple, JPEG2000 utilise une transformation en ondelettes qui crée une pyramide en ondelettes. Il existe d'autres pyramides, telles que les pyramides gaussiennes ou laplaciennes. Ce jeu de diapositives donne un bon aperçu de la façon dont les choses fonctionnent, tandis que JPEG2000 est discuté ici et ici .
jmiserez

Merci pour les informations sur les nouveaux formats JPEG. Je ne m'attends pas à ce que beaucoup d'images sources (appareils photo, scanners, etc.) les utilisent encore.
AFH

3

La réponse courte est non. Une image JPEG utilise la compression, ce qui signifie que chaque octet de sortie dépend de tous les autres. Si vous modifiez le nombre d'octets d'image, vous devez alors décompresser et recompresser.

Il y aura une perte de qualité à la suite de la recompression, car JPEG utilise la compression avec perte, mais vous perdez quand même la qualité en divisant la résolution par quatre. Vous pouvez obtenir la meilleure qualité possible de l'image basse résolution en augmentant le niveau de qualité JPEG lors de la recompression, bien que cela augmentera bien sûr la taille du fichier.

Si vous travaillez beaucoup avec des images, il est préférable de travailler dans un format de compression sans perte, tel que PNG, en convertissant en JPEG uniquement lorsque les images sont finalisées, à condition bien sûr que vous ayez l'espace disque supplémentaire.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.