2012-12-12 36 views
0

我知道这与合成有关,但我无法弄清楚什么。在代码前面的章节中,在一个BufferedImage像素的特定列表被设置为透明黑色:BufferedImage的透明区域正在写出黑色

 for(Pixel p : closed){ 
      Color c = new Color(image.getRGB(p.x, p.y)); 
      Color newC = new Color(0,0,0, 0); 
      image.setRGB(p.x, p.y, newC.getRGB() & 0x00000000); 
     } 

     if(andCrop){ 
      image = image.getSubimage(left, top, right-left, bottom-top); 
     } 


     return image; 

然后我尝试写出图像:

try { 

      BufferedImage out = new BufferedImage(image.getWidth(), image.getHeight(), java.awt.Transparency.TRANSLUCENT); 
      Graphics2D g2d = out.createGraphics(); 
      g2d.setComposite(AlphaComposite.Clear); 
      g2d.fillRect(0, 0, image.getWidth(), image.getHeight()); 
      g2d.setComposite(AlphaComposite.Src); 
      g2d.drawImage(image, 0, 0, image.getWidth(), image.getHeight(), null); 
      g2d.dispose(); 

      File outputfile = new File(file); 
      ImageIO.write(out, "png", outputfile); 
     } catch (IOException e) { 

     } 

现在,我知道,在我试图将图像绘制到它上面之前,“out”是清楚的。我没有得到的是我的合成有什么问题。我不是透明的,而是变得全黑。

所有使用的bufferedimages都是INT_ARGB。

编辑 - 这已解决。图像源来自ImageIO.read,返回的BufferedImage不支持alpha。快速读后转换可让其他代码顺利运行。

+0

为了更快提供更好的帮助,请发布[SSCCE](http://sscce.org/)。 –

+1

顺便说一句 - 我会使用['BufferedImage.TYPE_INT_ARGB'](http://docs.oracle.com/javase/7/docs/api/constant-values.html#java.awt.image.BufferedImage.TYPE_INT_ARGB)图片类型而不是[Transparency.TRANSLUCENT](http://docs.oracle.com/javase/7/docs/api/constant-values.html#java.awt.Transparency.TRANSLUCENT)。 –

回答

0

幼龙,这已经现在downvoted所以我不知道这将是相关的,但问题是,原来的BufferedImage正被ImageIO的阅读,而这种图像不支持ARGB。快速阅读后转换允许其余代码工作。

1

的事情,在我脑海......(感谢Andrew):

java.awt.Transparency.TRANSLUCENT = 3 
TYPE_INT_ARGB = 2 
TYPE_INT_ARGB_PRE = 3 

public BufferedImage(int width, 
       int height, 
       int imageType) 

Constructs a BufferedImage of one of the predefined image types. (TYPE_...) 

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/image/BufferedImage.html

所以它似乎基本上它是一个查询股价。

另外,你想达到的效果是什么?你清除一个空的图像,然后绘制完全透明的像素...我只是不明白。

+0

我以前使用过ARGB - 半透明是在一些绝望的抓取之后。我想也许最初的形象需要透明。 – mtrc

+0

我的问题是我有一个BufferedImage有一些 - 但不是全部 - 透明像素。例如,边框是透明的。我需要将它写入一个文件,但是当我这样做时,透明像素是不透明的,不透明的。 – mtrc

+0

恩,有一个错字,在源文件中有:public static final int OPAQUE = 1; public static final int BITMASK = 2; public static final int TRANSLUCENT = 3; - 但是我们的想法是,值3(来自TRANSLUCENT,这里意味着只是ARGB_PRE)以虚假方式分配 – vaxquis