在代码中,我将整个图像的像素的Alpha值设置为100,并在读取图像时将Alpha值设置为100。但是在检索部分,它给了我255(默认值)。出什么问题了?如何解决这个问题?任何帮助都将不胜感激。
类Demo {
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();
}}
发布于 2016-11-01 20:42:11
分配给im2的new BufferedImage(...)在您从ImageIO.read(..)分配了一个新值后被丢弃(垃圾回收)。由于新值是JPEG,并且没有alpha,因此设置什么alpha值都无关紧要。它们将始终保持255 (完全不透明)。
相反,您可能希望这样做:
// 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最后,您应该以支持无损alpha的格式编写图像,如PNG而不是JPEG,以确保获得预期的值:
ImageIO.write(im2,"PNG", new File("Demo_copy.png"));PS:使用JPEG也可以,因为内置的Java ImageIO JPEG插件支持读/写带有Alpha值的JPEG。然而,大多数其他软件会将这些错误地解释为CMYK JPEG,并且颜色看起来都是错误的。此外,JPEG是有损的,因此您很可能不会像在接收端所期望的那样看到确切的Alpha值(100)。这就是为什么我建议使用PNG。TIFF或其他支持alpha的格式也可以工作,但需要额外的插件。
https://stackoverflow.com/questions/40359720
复制相似问题