2017-09-22 13 views
3

J'ai un problème en essayant de faire une copie de l'objet BufferedImage. J'utilise la méthode drawImage (BufferedImage image, int x, int y, ImageObserver observer) pour dessiner l'image originale sur le nouveau, et je règle BufferedImage.TYPE_INT_ARGB pour chaque image, cependant, quand j'imprime les valeurs de nouvelles couleurs d'image, les valeurs RGBA sont légèrement différentes.Dessiner un BufferedImage à un autre BufferedImage est en train de changer les valeurs RGBA

Je dois faire une copie de l'image originale parce que j'ai un JPanel tenant une image à dessiner comme arrière-plan. Dans d'autres parties de mon application je dois obtenir l'image du panneau, mais je voudrais renvoyer une copie pour éviter que l'image soit modifiée d'ailleurs.

Comment puis-je résoudre ce problème?

code:

import java.awt.Color; 
import java.awt.Graphics2D; 
import java.awt.image.BufferedImage; 
public class BufferedImageColorBug 
{ 
    public static void main (String [] a) { 
     Color [] colors = { 
      new Color (202,230,186,14), 
      new Color (254,65,188,214), 
      new Color (247,104,197,198), 
      new Color (158,93,79,239), 
      new Color (235,45,57,194), 
      new Color (155,77,126,150), 
      new Color (164,237,20,172), 
      new Color (184,106,97,191), 
      new Color (187,249,135,85), 
      new Color (236,112,98,24) 
     }; 
     BufferedImage image = new BufferedImage (colors.length, 1, BufferedImage.TYPE_INT_ARGB); 
     for (int x = 0; x < colors.length; x ++) image.setRGB (x, 0, colors [x].getRGB()); 
     BufferedImage copy = new BufferedImage (image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     Graphics2D g2d = copy.createGraphics(); 
     g2d.drawImage (image, 0, 0, null); 
     g2d.dispose(); 
     for (int x = 0; x < colors.length; x ++) { 
      Color color = new Color (copy.getRGB (x, 0), true); 
      System.out.println (color.getRed() + "," + color.getGreen() + "," + color.getBlue() + "," + color.getAlpha()); 
     } 
    } 
} 

C'est le ouput je reçois:

200,237,182,14 
254,66,188,214 
247,104,197,198 
158,93,79,239 
235,45,57,194 
155,76,126,150 
165,237,19,172 
184,105,97,191 
186,249,135,85 
234,117,96,24 

EDIT

J'ai parlé de l'image de clonage parce que c'est mon but, mais cette question i aimerait comprendre pourquoi valeurs rgba sont différentes entre les images. J'ai déjà essayé d'utiliser BufferedImage.TYPE_INT_ARGB_PRE, mais cela n'a pas aidé.

Répondre

2

Pour créer une copie exacte de votre image (étant donné qu'ils sont tous les deux du même type), vous pouvez modifier le code un peu:

BufferedImage copy = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); 
copy.setData(image.getRaster()); // getRaster() is faster than getData(), as no copy is created 

for (int x = 0; x < colors.length; x++) { 
    Color color = new Color(copy.getRGB(x, 0), true); 
    System.out.println(color.getRed() + "," + color.getGreen() + "," + color.getBlue() + "," + color.getAlpha()); 
} 

Ce imprimera les mêmes couleurs que dans l'original colors tableau. PS: J'ai d'abord pensé que c'était un bug, mais je me rends compte maintenant que ce n'est probablement pas le cas. Après quelques tests, j'ai trouvé qu'il y avait une petite différence entre votre code et le code que j'utilise normalement pour cloner des images. Si vous modifiez la règle alpha compositing Src (ce qui signifie que la source contribuera et remplacer complètement les pixels à la destination), vous obtiendrez également le résultat escompté:

BufferedImage copy = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB); 

Graphics2D g2d = copy.createGraphics(); 
g2d.setComposite(AlphaComposite.Src); // Completely replace, default is SrcOver 
g2d.drawImage(image, 0, 0, null); 
g2d.dispose(); 

for (int x = 0; x < colors.length; x++) { 
    Color color = new Color(copy.getRGB(x, 0), true); 
    System.out.println(color.getRed() + "," + color.getGreen() + "," + color.getBlue() + "," + color.getAlpha()); 
} 

La raison en est que, dans la composition semi-transparente pixels sur des pixels complètement transparents, les pixels transparents originaux à la destination contribueront au résultat final, modifiant ainsi les valeurs RVBA.

+0

Merci, ça fonctionne comme un charme! – Ansharja