操纵BufferedImage的Alpha值

时间:2016-11-01 12:04:41

标签: java image-processing bufferedimage alpha

在代码中我将整个图像的像素的alpha值设置为100,并且我希望在读取图像时Alpha值为100。但在检索部分它给我255(默认值)。怎么了 ?以及如何解决?任何帮助将不胜感激......

课程演示 {

Demo()
{     
  try
  {

    BufferedImage im2 = new BufferedImage(width,height,BufferedImage.TYPE_INT_ARGB);
    File f2 = new File("test2.jpg");
    im2 = ImageIO.read(f2);       
    int width1 = im2.getWidth();
    int height1 = im2.getHeight();

    for(int i=0;i<height1;i++)
    {
        for(int j=0;j<width1;j++)
        {
            Color c = new Color(50,0,0,100);   //Set the alpha value to 100
           im2.setRGB(j,i,c.getRGB());         //  for every pixel
        }
    }
    File f = new File("Demo_copy.jpg");
    ImageIO.write(im2,"jpg",f);

    //  Retrieving.........
    BufferedImage im1;
    File f1 = new File("Demo_copy.jpg");
    im1 = ImageIO.read(f1);
    int width = im1.getWidth();
    int height = im1.getHeight();
    for(int i=0;i<height;i++)
    {
        for(int j=0;j<width;j++)
        {
        int pixel = im1.getRGB(j,i);
        Color c = new Color(pixel,true);
        int a = c.getAlpha();  
        System.out.println("Alpha value is :"+a);  // Printing Alpha : 255 for every pixel
        }
    }
  }catch(Exception e){}
}
public static void main(String [] ar)
{
    new Demo(); 
}

}

1 个答案:

答案 0 :(得分:0)

new BufferedImage(...)分配新值后,您分配给im2的{​​{1}}将被丢弃(垃圾回收)。由于新值是JPEG并且没有alpha,因此您设置的alpha值无关紧要。它们将始终保持ImageIO.read(..)(完全不透明)。

相反,你可能想做这样的事情:

255

最后,您应该以支持无损alpha的格式编写图像,例如PNG而不是JPEG,以确保获得您期望的值:

// Read opaque image...
BufferedImage img = ImageIO.read(new File("test2.jpg")); 

// ...convert image to TYPE_INT_ARGB...
BufferedImage im2 = new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);

Graphics2D g = im2.createGraphics();
try {
    g.drawImage(img, 0, 0, null);
}
finally {
    g.dispose();
}

// ... loop over and change alpha in im2 as before

PS:它也可能只使用JPEG,因为内置的Java ImageIO JPEG插件支持读取/写入带有alpha值的JPEG。但是,大多数其他软件会将这些错误解释为CMYK JPEG,并且颜色看起来都是错误的。此外,JPEG是有损的,因此您很可能看不到正好在接收端的alpha值(100)。这就是我建议使用PNG的原因。支持alpha的TIFF或其他格式也可以使用,但需要额外的插件。