2010-05-02 19 views
4

J'ai une image chargée à partir du disque (stocké comme BufferedImage), que je montre correctement sur un JPanel mais quand j'essaye de réenregistrer cette image en utilisant la commande ci-dessous, le l'image est enregistrée dans une teinte rougeâtre.Java 1.5.0_16 couleurs corrompues lors de l'enregistrement image jpg

ImageIO.write(image, "jpg", fileName); 

Remarque! l'image est un BufferedImage et fileName est un objet File pointant vers le nom de fichier qui sera sauvegardé qui se terminera par ".jpg".

J'ai lu qu'il y avait des problèmes avec les méthodes ImageIO dans les JDK précédents, mais je ne suis pas sur l'une de ces versions autant que j'ai pu trouver. Ce que je cherche est un moyen de résoudre ce problème sans mettre à jour le JDK, cependant ayant dit que je voudrais toujours savoir dans quel JDK ce problème a été fixé (si c'est encore un bug avec le JDK que j'utilise).

Merci.

+0

Ok, j'ai trouvé plus d'informations. J'ai essayé d'enregistrer l'image en tant que fichier png et les couleurs sont correctes. C'est donc l'encodeur jpg qui semble être incorrect. Il est vraiment important pour moi de sauvegarder l'image en tant que fichier jpg car les fichiers png sont volumineux. Quelqu'un a-t-il d'autres informations? Y at-il peut-être un autre mécanisme pour enregistrer l'image en tant que fichier jpg, peut-être grâce à la boîte à outils? – Coder

Répondre

5

Ok, a résolu mon problème, il semble que je dois convertir l'image en BufferedImage.TYPE_INT_RGB pour une raison quelconque. Je pense que les canaux alpha pourraient ne pas être manipulés correctement à une couche.

+0

Super d'entendre que vous avez trouvé une solution.Comme vous le savez, j'ai suggéré de changer le type d'image tamponnée dans ma réponse, mais sans connaître les détails de votre image, je ne pourrais pas dire avec certitude quel type d'image fonctionnerait. – mdma

+0

Oui à coup sûr, merci encore. Je ne suis pas sûr de savoir comment fonctionne tout ce vote (je suis nouveau sur ce forum) si c'est ce que vous suggérez, mais vous avez un point pour votre réponse. Je ne sais pas quel bon endroit pour cela, mais cela semble approprié de mettre ici. Comme je l'ai dit, je viens de rejoindre, mais jusqu'ici je suis vraiment impressionné par la poli et la réactivité de cette communauté. C'est un plaisir d'en faire partie. – Coder

+0

+1 pour des commentaires utiles. Je vous invite à accepter la réponse de @ mdma, car elle a identifié le problème sous-jacent. Bien sûr, vous pouvez également voter pour une réponse que vous avez trouvée utile. – trashgod

3

Je commencerais par examiner si c'est le modèle de couleur BifferedImage qui est le problème ou le codage jpeg. Vous pouvez essayer de changer le type d'image (3ème argument dans le constructor), pour voir si cela produit une différence, et aussi utiliser le JPEGCodec directement pour enregistrer le jpeg.

E.g.

BufferedImage bufferedImage = ...; // your image 
out = new FileOutputStream (filename); 
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder (out); 
JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam (bufferedImage); 
encoder.setJPEGEncodeParam (param); 
encoder.encode (bufferedImage); 
out.close(); 

EDIT: texte modifié, c'est le type d'image que vous voulez changer. Voir le lien vers le constructeur.

+0

Merci pour la suggestion. pourriez-vous fournir des extraits de code s'il vous plaît? Si en utilisant le codec directement, vous voulez dire Iterator écrivains = ImageIO.getImageWritersBySuffix ("jpeg") ;, alors j'ai déjà essayé et c'est le même comportement. – Coder

+0

Je veux dire utiliser le codec en utilisant l'extrait ci-dessus pour enregistrer votre image au format JPEG. – mdma

+0

Merci encore, j'ai essayé ce que vous avez suggéré (copié votre code exactement) et j'ai le même comportement. Cela signifie-t-il que le codeur est le problème? – Coder

1

Une autre approche consiste à rendre l'image dans un tampon TYPE_INT_ARGB, a un DirectColorModel avec alpha, comme indiqué ci-dessous et suggéré here.

private BufferedImage process(BufferedImage old) { 
    int w = old.getWidth(); 
    int h = old.getHeight(); 
    BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 
    Graphics2D g2d = img.createGraphics(); 
    g2d.drawImage(old, 0, 0, null); 
    g2d.dispose(); 
    return img; 
} 
+0

merci, essayé votre méthode mais toujours le même comportement. – Coder

+0

Ne fonctionnait pas pour JavaFX pour enregistrer l'image en tant que jpg. – Zon