尝试更改BufferedImage的像素值不成功

时间:2017-01-09 05:12:41

标签: java image pixel alpha

我的代码的预期输出(如下所示):

  在255之前

  在0之后

但实际输出是:

  在255之前

  255之后

我希望后者不是255,因为我试图将像素的低位显式设置为0.希望分析可能无法正常工作的内容。

File fimin = new File("C:\\sample.png");
BufferedImage img = null;
img = ImageIO.read(fimin);
int width = img.getWidth();
int height = img.getHeight();
int val, alpha;

System.out.println("before" + (((img.getRGB(0, 0)) >> 24) & 0xff)); 

for(int i = 0; i < width; i++) {
    for(int j = 0; j < height; j++) {
        val = 0;
        val = img.getRGB(i, j);
        val &= 0xfeffffff;//set lower bit ofalpha to zero
        img.setRGB(i, j, val);
    }
}
System.out.println("after" + (((img.getRGB(0, 0)) >> 24) & 0xff));

2 个答案:

答案 0 :(得分:2)

读取的图像不是ARGB类型。

要确保您拥有ARGB类型的图像,请执行以下操作:

  BufferedImage b2=new BufferedImage(img.getWidth(), img.getHeight(), BufferedImage.TYPE_INT_ARGB);
  b2.getGraphics().drawImage(img, 0, 0, null);

现在你可以改变alpha:

    System.out.println("before"+(((b2.getRGB(0,0))>>24)&0xff)+" "+img.getType()+" "+BufferedImage.TYPE_INT_RGB+" "+BufferedImage.TYPE_INT_ARGB);
    int val=b2.getRGB(0, 0);
    val&=0xfeffffff;//set lower bit ofalpha to zero
    b2.setRGB(0, 0, val);
    System.out.println("after"+(((b2.getRGB(0,0))>>24)&0xff));    

答案 1 :(得分:0)

我尝试了,并使用了png,它按预期工作:

  • 之前:255
  • 之后:254

也许我使用的图像具有预期顺序的像素字节ARGB,而您加载的图像文件没有?如果这是真的,@gpasch's答案可能会让您的代码处理更多图像格式(例如,让您控制图像在内存中的表示)。

import java.io.File;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;

public class image {

    public static void main(String args[]) {

        if (args.length < 1) {
            System.err.println("Usage: java image <image filepath>\n");
            System.exit(-1);
        }

        File imageFilename = new File(args[0]);

        BufferedImage img = null;
        try {
            img = ImageIO.read(imageFilename);
        } catch (Exception c) {
            System.out.println("Error reading image file " + imageFilename);
        }

        int width = img.getWidth();
        int height = img.getHeight();
        int val, alpha;

        System.out.println("Lower byte before: " + (((img.getRGB(0, 0)) >> 24) & 0xff));

        for(int i = 0; i < width; i++) {
            for(int j = 0; j < height; j++) {
                val = img.getRGB(i, j);
                val &= 0xfeffffff;//set lower bit ofalpha to zero 
                img.setRGB(i, j, val);
           }       
        }       
        System.out.println("Lower byte after: " + (((img.getRGB(0, 0)) >> 24) & 0xff));
    }
}