2009-08-13 7 views
10

Lorsque je lis certains fichiers JPG, les couleurs sont aplaties. Voici un exemple simple qui lit un jpg et écrit simplement la même image dans un autre fichier.Pourquoi Java ImageIO aplatit les couleurs JPEG

import java.awt.image.BufferedImage; 
import java.io.File; 
import javax.imageio.ImageIO; 

public class JPegReadTest { 
    public static void main(String[] args) { 
     if (args.length == 2) { 
      try { 
       BufferedImage src = ImageIO.read(new File(args[0])); 
       ImageIO.write(src, "jpg", new File(args[1])); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } else { 
      System.err.println("Usage: java JPegReadTest src dest"); 
     } 
    } 
} 

Si vous essayez cela avec par exemple http://www.flickr.com/photos/visualpanic/233508614/sizes/l/, diffèrent les couleurs de l'image de destination à partir du fichier source. Pourquoi donc? Comment le réparer?

Également essayé d'enregistrer l'image en tant que png, mais les couleurs sont fades dedans aussi (en supposant que les informations de couleur ne sont pas lues correctement).

+0

Avez-vous comprendre comment conserver le profil de couleur? Je suis confronté au même problème –

Répondre

10

Il pourrait y avoir plusieurs raisons.

  1. Les données de couleur JPEG sont souvent stockées en tant que YCrCb au lieu de RVB, bien que les conversions soient pour la plupart imperceptibles.
  2. JPEG a souvent un profil de couleur intégré, mais de nombreuses applications ne le comprennent pas et l'ignorent simplement (auquel cas, le profil de couleur peut manquer dans votre fichier de sortie).
  3. La valeur gamma peut être réinitialisée ou manquante après que Java l'ait effrité.

Je n'ai pas vraiment essayé votre exemple ... pourriez-vous s'il vous plaît poster à la fois avant et après les fichiers? Sans pouvoir réellement examiner le fichier résultat, il est difficile de dire si ces données supplémentaires sont là ou non.

Editer: Oui, il est clair que vos images originales et converties ont des profils de couleur différents. Java a supprimé le profil de couleur de l'original et a utilisé le sRGB générique à la place. Ils nous ressemblent sous Windows avec Firefox et des programmes assortis car ces programmes n'utilisent pas le profil couleur lors du rendu. Cependant, sur votre Mac, Mac prend en charge ces profils de couleur (cue débat sur Mac pour les graphiques, etc.) et donc ils rendent différemment. Je n'ai pas de Mac à portée de main, mais je suppose que si vous ouvrez les fichiers dans Photoshop sur n'importe quelle plate-forme, vous verrez la différence.

+0

Ok, voici les fichiers avant et après. http://terokinnunen.jalbum.net/Colortest/orig.jpg http://terokinnunen.jalbum.net/Colortest/converted-jpg.jpg a également essayé de sauver comme .png, toujours fade http: // terokinnunen .jalbum.net/Colortest/converted-png.png – ketorin

+0

Intéressant: pour moi (Ubuntu 9.04, Firefox 3.5/Gimp) l'original et converti ressemble à peu près au même (artefacts modulu JPEG). La seule différence que je peux trouver avec GIMP est que l'original spécifie "sRGB IEC61966-2.1" comme espace de couleur, alors que le converti a "sRGB built-in". –

+0

Ils le font? En effet intéressant. Pour moi (Mac et Safari ou Firefox) les couleurs sont notablement différentes dans les couleurs converties. J'ai également vérifié avec Windows et à ma grande surprise, ils ont l'air à peu près la même chose, seulement une légère différence. – ketorin

0

jpeg est un format avec perte. Lorsqu'il est lu, java le stocke comme un format brut un peu comme un BMP. Ensuite, il est à nouveau écrit à l'origine de la perte de données. En outre, il n'y a pas beaucoup de contrôle sur la qualité, comme lorsque vous utilisez quelque chose comme GIMP. Peut-être envisager d'utiliser d'autres API comme Image Magick pour vous donner plus de contrôle sur la qualité.

+2

Non pertinent. OP signale un problème important de profil de couleur au-delà de la simple recompression. – erjiang

0

JPEG est un format lossy. Cela signifie que si vous ouvrez un fichier et que vous le sauvegardez à nouveau, vous perdrez quelques informations à moins de prendre des mesures très précises pour ne pas en perdre (dans ce cas, les manipulations possibles sont très limitées).

De plus, ImageIO.write() utilise probablement certains paramètres de qualité par défaut pour enregistrer les fichiers JPEG, qui peuvent être inférieurs à l'original, ce qui entraînerait une perte de qualité supplémentaire.

Essayez d'enregistrer dans un fichier PNG et vous verrez qu'il sera le même que la source.

+0

J'ai essayé d'enregistrer en png, mais il semble également fade en couleur, la même chose que l'image enregistrée jpg. J'ai l'impression que les couleurs ne sont même pas lues correctement. – ketorin

+0

Dans ce cas, le problème pourrait être qu'un certain profil de couleur est stocké dans l'image que Java ne lit/n'interprète pas. –

2

Votre image source a peut-être un profil de couleur assigné avec une gamme plus large que sRGB (comme Adobe RGB), et votre cycle de chargement/sauvegarde ne conserve pas les informations de l'espace colorimétrique? Sans profil de couleur, votre spectateur assumera sRGB, et la gamme compressée donnera l'impression que tout est "blah".Si vous avez exiftool,

exiftool -ProfileDescription filename.jpg 

est un moyen rapide de vérifier les profils de couleur sur vos images source et sortie.

+0

Oui, cela pourrait être le problème, le profil est en effet manquant dans les fichiers de sortie. Ce fil semble prometteur: http://forums.java.net/jive/thread.jspa?threadID=60631&tstart=0, va le regarder ensuite. – ketorin

+0

Oups, ce n'était pas le bon fil: http://forums.java.net/jive/message.jspa?messageID=205964 – ketorin

0

Voici un lien avec le code source qui se développe sur l'interface ImageIO - vous pouvez modifier les paramètres de qualité et de compression lors de l'écriture d'une image .... http://www.universalwebservices.net/web-programming-resources/java/adjust-jpeg-image-compression-quality-when-saving-images-in-java

+0

Ceci est vague. L'avez-vous essayé avec l'image de la question? Fondamentalement, vous dites à OP de * vérifier à nouveau les docs *. Et la réponse acceptée suggère que cette réponse ne résoudra pas les problèmes d'OP. – andr

Questions connexes