【问题标题】:Manipulating the Alpha value of BufferedImage操作 BufferedImage 的 Alpha 值
【发布时间】:2016-11-01 12:04:41
【问题描述】:

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

类演示 {

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

}

【问题讨论】:

    标签: java image-processing bufferedimage alpha


    【解决方案1】:

    您分配给im2new 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 的格式也可以使用,但需要额外的插件。

    【讨论】:

    • 好东西!考虑将答案标记为已接受,以表明它解决了您的问题。
    • 先生,上述解决方案非常适用于 png 文件。但是有什么方法可以让我也可以为 jpg 文件实现它。我想在 jpg 图像中设置我选择的 值并想检索相同的值。
    • 上述解决方案也适用于 JPEG,除了 a) JPEG 是有损压缩,因此您读取的值与您读取的值不完全相同写b) 将 ARGB 存储在 JPEG 流中不符合 JFIF,大多数其他软件会将其误解为 CMYK(或 YCCK)。这就是我推荐使用PNG的原因。如我的回答所述。但如果你能接受上述情况,你也可以使用 JPEG。
    • 那么有什么方法或技巧可以让我以 jpg 格式检索相同的值。我正在做一个项目,并且要完成该项目,我需要在检索结束时获得确切的值。 Atlast,感谢您的大力帮助....
    • @KeshavJoshi 您似乎不了解有损压缩的概念。数据丢失。扔掉了。 在此过程之后无法重新创建完全相同的值。您当然可以使用 JPEG-Lossless,但这与标准 JPEG 压缩完全不同。开箱即用的 ImageIO 不支持它,并且通常不太支持。只使用 PNG 会容易得多。
    猜你喜欢
    • 1970-01-01
    • 2014-02-16
    • 2017-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    相关资源
    最近更新 更多