Pourquoi Java ImageIO aplanit couleurs JPEG

voix
10

Quand 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.

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/ , les couleurs de l'image de destination diffèrent du fichier source. Pourquoi donc? Comment le réparer?

Aussi essayé sauver l'image au format PNG, mais les couleurs sont fades en trop (donc en supposant que les informations de couleur est pas lu correctement).

Créé 13/08/2009 à 13:32
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
10

Il pourrait y avoir plusieurs raisons.

  1. Les données de couleur JPEG est souvent stockée sous forme YCrCb au lieu de RVB, bien que des conversions devraient être la plupart du temps imperceptibles.
  2. JPEG a souvent un profil de couleur intégré, mais de nombreuses applications ne comprennent pas cela et ignorer simplement (dans ce cas, votre fichier de sortie peut-être manquant le profil de couleur).
  3. valeur gamma pourrait être remis à zéro ou manquant après Java mutile il.

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

Edit: Oui, il est clair que vos images originales et converties ont des profils de couleurs différentes. Java dépouillé profil de couleur de l'original et utilisé sRGB générique à la place. Ils regardent la même chose pour nous sur Windows avec Firefox et des programmes assortis parce que ces programmes n'utilisent pas le profil de couleur quand renderer. Cependant, sur votre Mac, Mac prend en charge réellement ces profils de couleurs (débat cue sur Mac pour les graphiques, etc.) et ils rendent différemment. Je n'ai pas de Mac à portée de main, mais je pense que si vous ouvrez les fichiers dans Photoshop sur toute plate - forme, vous verrez la différence.

Créé 13/08/2009 à 13:44
source utilisateur

voix
2

Peut-être votre image source a un profil de couleur attribuée avec une gamme plus large que sRGB (comme Adobe RVB), et la charge / le cycle de sauvegarde est pas de conserver les informations colorspace? Sans profil de couleur, votre lecteur prendra sRGB, et la gamme comprimé fera tout look « bla ». 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.

Créé 13/08/2009 à 15:15
source utilisateur

voix
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 qualité-when-économie d'images en java

Créé 18/01/2013 à 01:29
source utilisateur

voix
0

JPEG est un lossy format.

Cela signifie que si vous ouvrez un fichier et de l'enregistrer à nouveau, vous perdrez quelques informations, sauf si vous prenez des mesures très spécifiques ne pas 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 des fichiers JPEG, ce qui pourrait être inférieur à l'original, ce qui conduirait à une perte supplémentaire de qualité.

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

Créé 13/08/2009 à 13:47
source utilisateur

voix
0

jpeg est un format lossy. Lors de la lecture dans les magasins, java comme un format brut beaucoup comme un BMP. Ensuite, il est en cours d'écriture à nouveau causer la perte de données. En outre, il ny a pas beaucoup de contrôle sur la qualité comme lorsque vous utilisez quelque chose comme GIMP.

Peut - être regarder en utilisant d' autres API comme Image Magick pour vous donner plus de contrôle sur la qualité.

Créé 13/08/2009 à 13:45
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more