在代码中我将整个图像的像素的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();
}
}
答案 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或其他格式也可以使用,但需要额外的插件。