Comment puis-je ajouter une bordure à une photo JPEG sans affecter la qualité?


24

J'ai une photo au format JPEG avec une résolution 4680x3120. Je veux ajouter une bordure blanche autour de cette photo, en la transformant en une photo 5200x3467 (pour des raisons d'impression).

De toute évidence, je ne modifie ni ne supprime rien de la photo, j'ajoute simplement quelque chose. Par conséquent, en principe, cette procédure peut être sans perte. Cependant, si je devais utiliser Paint pour ajouter cette bordure, le processus d'enregistrement de Paint compressera à nouveau la photo au format JPEG, perdant ainsi des informations et de la qualité.

Existe-t-il un moyen (un programme plus professionnel) d'ajouter quelque chose à une photo JPEG, comme une bordure, sans affecter la partie originale de la photo, sans réduire sa qualité?

Réponses:


35

Bien que la réponse de Philip soit la meilleure voie à suivre, il est possible de faire ce que vous voulez entièrement dans le domaine du JPEG.

JPEG fonctionne en décomposant votre image en blocs appelés unités de codage minimum (MCU), généralement 16 × 16 chacune, et en les compressant séparément. Vous pouvez le voir dans les images lorsque vous augmentez le niveau de compression très haut. À des niveaux de compression plus raisonnables, les blocs se mélangent si bien que vous ne voyez jamais les bordures.

Nous pouvons profiter de ce fait pour ajouter sans perte une simple bordure blanche à une image. Nous devons simplement créer un tableau creux de blocs blancs égal à la taille de l'image de sortie, puis déposer les blocs JPEG MCU d'origine au milieu.¹

Il y a un inconvénient à cette technique: elle ne fonctionne que lorsque les tailles d'image d'entrée et de sortie sont toutes deux un multiple pair de la taille du MCU. Lorsque ce n'est pas le cas, nous devons recompresser certains des blocs à la marge entre la bordure blanche et les bords de l'image d'origine. Vous ne verrez pas cette différence dans la sortie si vous restez à l' écart des niveaux de compression JPEG trop élevé, donc il est encore efficace sans perte.

Je ne connais aucun programme qui ne fait que cela. La chose la plus proche que je sache est quelque chose qui fait l'opération inverse: jpegtran a une fonction de recadrage qui coupe sans perte les parties des bords de l'image. le milieu intact.

La solution prête à l'emploi la plus simple que je connaisse est le plugin Better JPEG Lossless Resave pour Photoshop. Il utilise des techniques basées sur les idées données ci-dessus pour copier des MCU à partir de l'image d'origine partout où cela est possible, afin d'éviter de les recréer à partir de la version non compressée, comme le fait normalement Photoshop.³


Digressions:

  1. Vous pourriez penser que la bordure résultante ne sera pas tout à fait blanche , car la perte de JPEG créera une sorte de différence de couleur dans la sortie. J'ai fait quelques tests, et dans Photoshop au moins, une image purement blanche enregistrée via le niveau JPEG de Save For Web 10 (c'est-à-dire de qualité "faible") donne une image décodée qui est toujours purement blanche.

    J'ai déterminé cela avec deux tests:

    Tout d'abord, j'ai chargé le JPEG en tant que calque au-dessus de l'original, défini le mode de fusion du calque supérieur sur Différence, puis ajouté un calque de réglage des niveaux au-dessus pour essayer d'agrandir les différences. L'image résultante est restée noire, indiquant «aucune différence».

    Deuxièmement, lorsque je n'ai pas vu les différences attendues, j'ai laissé tomber le calque de réglage et remis le calque JPEG en mode de fusion Normal, j'ai pris l'outil pipette et j'ai cherché sur toute l'image un pixel qui n'apparaissait pas en RVB (255,255,255 ) dans le panneau Info. Je n'en ai jamais trouvé. Je m'attendais à voir les chiffres scintiller un peu pendant que je parcourais l'image, mais ils sont restés stables.

    Je peux seulement conclure qu'il s'agit d'un cas dégénéré de l'algorithme de codage: les blocs blancs purs restent blancs pendant la transformée en cosinus discrète .

    Fait intéressant, cela ne se produit pas avec des blocs noirs purs. Au moins avec l'implémentation de Photoshop, ils se transforment en RVB (1,1,1) lorsqu'ils sont décodés, pas RVB (0,0,0).

    En fin de compte, vous n'avez pas à vous soucier des points pulvérisés dans cette zone de bordure lors de l'impression d'une image produite à l'aide de la technique ci-dessus.

  2. jpegtranest un programme en ligne de commande, mais il existe également un programme GUI Windows basé sur le même code appelé jpegcrop.

  3. Hélas, ce plugin est uniquement Windows.


1
J'ai utilisé un programme appelé JPEG Wizard qui offrait de telles fonctionnalités. Il avait également une très belle capacité à appliquer différents taux de compression à différentes parties d'un JPEG. On pourrait donc utiliser un réglage de haute qualité pour la tête et les mains d'une personne, une qualité moyenne pour ses vêtements et une qualité inférieure pour l'arrière-plan, et ainsi se retrouver avec un fichier plus petit mais de meilleure qualité globale que si l'on avait utilisé une qualité moyenne pour tout.
supercat

1
Je n'ai pas eu la chance de l'essayer, mais ce billet de blog suggère que jpegtranla fonction de recadrage peut également être utilisée pour s'étendre. (Je ne sais pas de quelle couleur les bordures étendues finissent, cependant.)
mattdm

4
@mattdm: Oui, jpegtranpeut également étendre l'image, mais il remplit toujours avec un gris moyen codé en dur, RVB (128,128,128). Il le fait simplement parce que c'est la seule option facile, car dans l'espace des coefficients DCT, vous pouvez le faire avec un simple bzero()appel. J'ai essayé un hack sauvage pour changer cela , ce qui ne fonctionne pas, mais devrait vous donner une idée de la laideur impliquée. lève les mains de frustration
Warren Young

@WarrenYoung: Pour modifier la couleur des blocs de rembourrage, vous devez probablement modifier uniquement le premier coefficient (DC) et laisser les autres à zéro. Bien sûr, les coefficients sont compressés, donc ... de toute façon, cela devrait être faisable, mais je conviens que ce n'est pas aussi trivial que cela puisse paraître.
Ilmari Karonen

2
En ce qui concerne votre dernier point - la plus grande économie provient du fait de jeter des informations à haute fréquence. Le gain de la précision de la couleur d'un bloc de pixels solide ne peut pas être supérieur à un octet ou deux, donc ce n'est jamais ou presque jamais fait. S'il y a une perte d'informations, c'est dans la conversion d'espace colorimétrique YUV <-> RVB.
Hobbs

20

Le point à retenir ici est que vous perdez de la qualité lors de l' enregistrement de la photo dans un format de compression avec perte. Tant que vous enregistrez la photo dans un format sans perte (PSD, TIFF, etc.) après avoir ajouté la bordure, vous ne perdrez pas plus de données que vous n'en avez déjà perdues en enregistrant la photo au format JPEG en premier lieu.


1
Merci. Et cela est vrai même lorsque vous utilisez un programme "merdique" comme Paint, lorsque vous l'enregistrez par exemple dans TIFF?
LBogaardt

4
Au moins selon mon test rapide, Paint utilise l' algorithme de compression LZW sans perte lors de l'enregistrement des fichiers TIFF, ce qui semble correct.
Philip Kendall

5
Gardez à l'esprit que cela est susceptible d'augmenter considérablement la taille de l'image ...
BlueRaja - Danny Pflughoeft

2
la peinture prend également en charge PNG, qui est également un format sans perte
phuclv

+1 pour cela car les réponses qui discutent de la sauvegarde en jpeg ne sont pas compatibles avec toutes les options d'encodage jpeg.
James Snell

6

Ce n'est pas tout à fait sans perte, mais vous pouvez vous rapprocher assez en utilisant GIMP (ou un autre éditeur avec une fonctionnalité similaire) et les deux astuces suivantes:

  1. Tout d'abord, assurez-vous que la bordure que vous ajoutez est un multiple de 8 pixels de large (et de préférence un multiple de 16 pixels).

    Ceci est important car l'algorithme de compression JPEG divise l'image en blocs de 8 × 8 pixels *, en partant du coin supérieur gauche, et applique l'algorithme de compression avec perte indépendamment à chaque bloc. Ainsi, au moins en principe, vous pouvez remplir sans perte une image JPEG en ajoutant des blocs de 8 × 8 pixels complets autour des blocs existants. Si, toutefois, vous tentiez d'ajouter une bordure qui n'était pas un nombre entier de blocs de large, les blocs de l'image rembourrée ne seraient pas alignés avec ceux de l'original et une perte de compression serait inévitable.

    *) En fait, la plupart des images JPEG utilisent un sous - échantillonnage de chrominance , ce qui signifie que seule la partie en niveaux de gris de l'image est réellement compressée en blocs de 8 × 8, tandis que les canaux de chrominance sont réduits de 50% avant la compression, ce qui rend leur taille de bloc effective 16 × 16 pixels. Ainsi, pour de meilleurs résultats, la largeur de votre bordure doit vraiment être un multiple de 16 pixels. Cependant, vous pouvez généralement vous en sortir avec une bordure de 8 (ou 24 ou 40 etc.), car un peu de perte de compression dans le chroma n'est pas très perceptible.

  2. La deuxième partie de l'astuce consiste, lors de l'enregistrement de l'image finale, à cocher la case "Utiliser les paramètres de qualité à partir de l'image d'origine" dans la boîte de dialogue Exporter l'image au format JPEG (sous Paramètres avancés). Faites-le même s'il semble que cela entraînerait une qualité inférieure à celle que vous utiliseriez normalement!

    Ce paramètre permet à GIMP de réutiliser les mêmes paramètres de compression que ceux utilisés pour l'image d'origine, ce qui élimine généralement environ 99% des pertes de compression, à condition que vous n'ayez pas trop modifié l'image, et en particulier que les blocs dans le nouvelle image toujours alignée avec celles de l'original. (Il y aura parfois encore des pertes en raison d'erreurs d'arrondi, mais beaucoup moins qu'il n'y en aurait autrement.)


Comme démonstration rapide, j'ai pris cette image de test JPEG de Wikimedia Commons , initialement enregistrée avec un paramètre de qualité assez faible de 50, et y ai ajouté une (fantaisie) sorte de bordure en noir et blanc de 8 pixels en utilisant la méthode décrite ci-dessus:

Image de test avec bordure 8px, principalement sans perte

Voici la différence entre l'original (15,1 kB) et l'image éditée (16,7 kB), montrée en utilisant le mode de calque "Grain extract" de GIMP:

Différence entre l'image rembourrée et l'original

Vous pouvez voir de très légères erreurs de chrominance, dues au fait que la largeur de la bordure n'est pas un multiple de 16, et (si vous regardez de près) quelques blocs où il y avait également des pertes mineures dans le canal de luma en raison de l'arrondi. Pourtant, visuellement, l'original et l'image rembourrée sont pratiquement indiscernables, même à un grossissement 2x et en alternant entre eux.

En particulier, contrastez cela avec le résultat de l' augmentation de la qualité JPEG de 50 à 60 avant d'enregistrer l'image rembourrée, ce qui donne l'image suivante de 17,6 Ko:

Image test avec bordure 8px, qualité augmentée de 50 à 60

À fort grossissement, vous pouvez certainement voir que l'image éditée est nettement plus floue à certains endroits que l'original, et prendre la différence avec l'extrait de grain le confirme:

Différence entre l'image rembourrée (à q60) et l'original


"la sélection de cette case à cocher ne semble pas affecter le paramètre" Progressif "." Pas un bug, car l'encodage progressif est un paramètre d'encodage, pas un paramètre de qualité. Jpegtran peut convertir des images vers et depuis progressif sans perte.
Damian Yerrick

@tepples: Vous avez raison; J'ai supprimé ce paragraphe. Pour une raison quelconque, j'avais l'impression que le basculement du mode progressif ferait en sorte que les paramètres de qualité ne correspondent pas, mais un test rapide semble confirmer que j'avais tort à ce sujet.
Ilmari Karonen

1
@thomasrutter: Je ne peux pas rétrograder un commentaire, je vais donc simplement vous pointer vers le post original du forum décrivant la fonctionnalité , et en particulier, cette citation: " Si vous n'avez apporté que quelques modifications à l'image, utiliser les mêmes tables de quantification vous donnera presque la même qualité et la même taille de fichier que l'image d'origine. Cela minimisera les pertes causées par l'étape de quantification, par rapport à ce qui se passerait si vous
utilisiez

1
À titre de comparaison, voici un autre exemple de réponse à une autre question. Ma compréhension en théorie est d'accord avec Ilmari mais au moins dans mon exemple, la pratique semble être beaucoup plus avec ce que dit Thomas - du moins en commençant avec une image très dégradée. (Je pense que la pierre tombale est un mauvais exemple à cet effet, car la perte de détails sur la pierre est moins évidente que sur la peau humaine.)
mattdm

1
@mattdm: Il semble être assez dépendant du logiciel; J'ai essayé de reproduire vos résultats à partir de cette réponse dans GIMP, et il semble que GIMP (v2.8.10, au moins) soit un peu mieux pour préserver la qualité JPEG que ImageMagick (quelle que soit la version que vous avez testée). Votre première image, enregistrée une fois à q75, a un PSNR de 34,0298, tandis que celle enregistrée deux fois à q75 en a une de seulement 32,8169 (et celle enregistrée 8 fois a un PSNR de 32,6459). En comparaison, enregistrer la même image source une fois dans GIMP à q75 donne un PSNR de 36,4560; l'ouvrir et le réenregistrer de la même qualité ne le fait que légèrement baisser, à 36,3295.
Ilmari Karonen

3

Désolé si ce n'est pas exactement ce que vous vouliez mais ...

Cela ressemble à l'ajout d'une bordure blanche pour vous aider à positionner votre image lors de l'impression. Pourquoi ne pas vous concentrer sur l'apprentissage des interfaces d'impression correctement et éviter les hacks douteux comme celui-ci? L'autre problème que cela soulève est que vous autorisez le programme d'impression à redimensionner votre image 4680x3120 pour l'adapter à la résolution / DPI correcte. Cela pourrait avoir un effet plus grave que de réenregistrer un fichier jpeg.


Les deux points valides, merci. Cependant, j'ai téléchargé ma photo dans l'une de ces imprimeries en ligne, donc je n'ai aucun contrôle sur l'imprimante réelle.
LBogaardt

1

Les réponses précédentes sont très bonnes.

Je vais juste ajouter quelques "aspects psychologiques" du format jpg.

Si un jpg est bien préparé, il ne perd qu'environ 0,5% d'informations. C'est dans la grande majorité des cas quelque chose que l'œil humain ne peut pas voir. Vous avez besoin d'un programme pour faire une analyse et voir les différences (comme l'analyse qu'Ilmari vient de faire).

La «bonne qualité» est un processus, pas seulement la façon dont un format de fichier enregistre l'image. Oui, vous avez recompressé le fichier avec jpg une fois de plus parce que vous en aviez vraiment besoin. S'il s'agit d'une situation contrôlée, il est acceptable de le faire.

Vous en aviez vraiment besoin, cela implique que vous ne pouvez pas utiliser un autre format sans perte, que vous avez des besoins de stockage ou de logiciels très spécifiques ou un flux de travail très serré.

Si vous êtes vraiment préoccupé par la qualité, vous n'utiliserez probablement pas Paint. Le format JPG a certaines configurations que vous ne pouvez pas contrôler du tout dans Paint.

Voici ma liste de programmes gratuits où vous pouvez vraiment contrôler la compression jpg et l'option que vous devez sélectionner. (Tous dans la boîte de dialogue d'enregistrement jpg)

Irfanview - Activer Désactiver le sous-échantillonnage des couleurs de chrominance.

Visionneuse d'images FastStone - Sous-échantillonnage des couleurs: Aucun.

Gimp - Sous-échantillonnage 4: 4: 4

Conclusion. N'utilisez pas de peinture.

Une chose que je n'ai pas encore vérifiée. Si tous ces programmes conservent le profil de couleur intégré. Je modifierai mon message plus tard.


Quelqu'un a voté -1 sur cette réponse. Normalement, je m'en fiche car je sais que je peux dire quelque chose de stupide. Dans ce cas précis, quelle partie de la réponse est fausse?
Rafael

Je n'ai pas voté (en haut ou en bas), mais vous voudrez peut -être travailler votre orthographe et votre grammaire pour donner une meilleure première impression (et aussi, honnêtement, pour rendre votre réponse plus facile à lire). De plus, cette question a déjà plusieurs réponses (et la mienne, en particulier, s'est avérée assez longue); à un moment donné, certaines personnes peuvent commencer à voter (ou du moins à ne pas voter) des réponses qui n'ajoutent pas clairement quelque chose de nouveau aux réponses existantes. Essayez également de structurer votre réponse de manière à ce que les éléments importants ressortent d'un coup d'œil; dans ce cas, la seule partie que vous avez mise en évidence en gras est une note de bas de page sans importance.
Ilmari Karonen

Merci pour ton commentaire Ilmari. Je me bats pour penser en anglais, car ce n'est pas ma langue maternelle. Je vais chercher un outil d'orthographe. Je ne sais pas s'il y en a une grammaire. - Pour la deuxième partie du commentaire, je comprends que la logique derrière StackExchange est de répondre à la question de manière indépendante, car le flux des réponses n'est pas fixe, car ils peuvent changer l'ordre ou être modifiés. Je vais y jeter un œil. (J'ai supprimé le texte en gras) Merci encore. : o)
Rafael

1
"il ne perd qu'environ 0,5% d'informations" [citation nécessaire] :)
Warren Young

Hé Warren, le voici: otake.com.mx/Apuntes/PruebasDeCompresion2/… Il est en espagnol, veuillez utiliser google translate pour l'instant, et je dois le mettre à jour. En fait c'est moins de 0,392% :)
Rafael

0

IrfanView fonctionne bien pour moi pour les ensembles d'images. Voici quelques notes pratiques

Voici ma procédure stockée pour l'insertion d'une bordure - Procédure Infran pour ajouter une bordure

  1. Image du clic droit, 'Ouvrir avec' -> 'InfranView'
  2. Appuyez sur «b»
  3. Cochez «Utiliser les options avancées» en haut à gauche, appuyez sur «Avancé»
  4. Cochez «Taille du canevas», appuyez sur «Paramètres»
  5. Entrez chaque largeur de bordure (côté gauche, côté droit, côté supérieur, côté inférieur)
  6. Appuyer sur OK'
  7. Sélectionnez «Remplacer les fichiers existants»
  8. Appuyer sur OK'
  9. Entrez le répertoire de sortie 'Répertoire de sortie pour les fichiers de résultats:'
  10. Accédez à l'image et double-cliquez dessus pour ajouter une bordure dans la liste supérieure. Cela l'ajoute à la liste des «fichiers d'entrée:» en bas de la liste
  11. Appuyez sur «Démarrer le lot»

1
Pourriez-vous expliquer ce qui est spécial à propos de cette méthode afin qu'elle réponde aux exigences de l'affiche de ne pas réduire la qualité de l'image? En première lecture, cela semblerait envoyer le JPEG à travers tout le cycle de décompression-recompression que l'affiche essaie d'éviter.
Philip Kendall

hmmm, vous apportez un point intéressant en ce qui concerne le cycle de vie de l'image à travers le processus que je liste ici, je n'y ai pas pensé. Vous avez peut-être raison, si vous souhaitez que je supprime ou modifie mon annonce, faites-le moi savoir :)!
J-Dizzle
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.