2017-09-22 8 views
3

BufferedImageオブジェクトのコピーを作成しようとしました。BufferedImageを別のBufferedImageに描画すると、RGBA値が変更されます

私はdrawImage (BufferedImage image, int x, int y, ImageObserver observer)メソッドを使用して新しいイメージに元のイメージを描画していますが、イメージごとにBufferedImage.TYPE_INT_ARGBを設定していますが、新しいイメージカラーの値を印刷するとRGBA値が少し異なります。

私はJPanelが背景として描画されているため、元の画像のコピーを作成する必要があります。私のアプリケーションの他の部分では、パネルからイメージを取得する必要がありますが、イメージが他の場所から変更されないようにコピーを返したいと思います。

どうすればこの問題を解決できますか?

コード:

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()); 
     } 
    } 
} 

ですouputを私が取得:

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

私はこれが私の目標ですので、画像をクローニングについて話しましたが、この質問と私なぜ理解したいですか rgbaの値は画像によって異なります。

すでにBufferedImage.TYPE_INT_ARGB_PREを使用しようとしましたが、役に立たなかったです。

答えて

2

(彼らは同じ型の両方になっている指定された)あなたのイメージの正確なコピーを作成するには、コードを少し変更することができます。

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()); 
} 

これはあなたのオリジナルと同じ色を印刷しますcolorsアレイ。


PS:これは最初はバグだと思っていましたが、今は実現していない可能性があります。

いくつかのテストの後、私はあなたのコードと私が通常画像を複製するために使用するコードの間に少しの違いがあることを発見しました。あなたは(貢献し、完全に先のピクセルを交換する唯一のソースを意味する)Srcにアルファ合成規則を変更する場合は、予想される結果を取得します:

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()); 
} 

理由は、その構成で半透明です最終的な結果に寄与し、RGBA値を変更することになる。

+0

ありがとう、それは魅力のように動作します! – Ansharja

関連する問題