如何在java中清除BufferedImage的像素?

时间:2014-08-17 06:28:27

标签: java pixel bufferedimage alpha

在java中,我读取一个图像,然后浏览像素,如果它的颜色距离是< 30,然后我想通过将其alpha更改为0来清除图像。这是我的代码:

但这不起作用。它没有效果......

有没有人看到这个问题?

由于

import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import javax.imageio.ImageIO;

public class Recognize {

    public static void main(String args[]) throws IOException {

        Path path = Paths.get("images/fish.png");
        File file = path.toFile();

        if (file.exists()) {
            InputStream stream = Files.newInputStream(path);
            BufferedImage bufferedImage = ImageIO.read(stream);

            int width = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();

            if (width > 0 && height > 0) {
                int TLpixel = bufferedImage.getRGB(0, 0);
                Color TLcolor = new Color(TLpixel);

                for (int i = 0; i < width; i++) {
                    for (int j = 0; j < height; j++) {
                        int pixel = bufferedImage.getRGB(i, j);
                        Color color = new Color(pixel);
                        double distance = ColourDistance(TLcolor, color);
                        //System.out.println(distance);

                        if (distance < 30) {
                            int mc = (0 << 24) | 0x00ffffff;
                            int newcolor = pixel & mc;
                            bufferedImage.setRGB(i, j, newcolor);      
                        }
                    } 
                }



                File outputfile = new File("images/fish_new.png");
                ImageIO.write(bufferedImage, "png", outputfile);

            }
        }
    }

    public static int[] printPixelARGB(int pixel) {
        int alpha = (pixel >> 24) & 0xff;
        int red = (pixel >> 16) & 0xff;
        int green = (pixel >> 8) & 0xff;
        int blue = (pixel) & 0xff;
        return new int[] {red, green, blue, alpha};
    }

    public static double ColourDistance(Color c1, Color c2) {
        double rmean = ( c1.getRed() + c2.getRed() )/2;
        int r = c1.getRed() - c2.getRed();
        int g = c1.getGreen() - c2.getGreen();
        int b = c1.getBlue() - c2.getBlue();
        double weightR = 2 + rmean/256;
        double weightG = 4.0;
        double weightB = 2 + (255-rmean)/256;
        return Math.sqrt(weightR*r*r + weightG*g*g + weightB*b*b);
    } 
}

1 个答案:

答案 0 :(得分:2)

通过&#34;清除&#34;你明显意味着像素使像素透明&#34;。

为了能够使像素透明,图像必须支持透明像素。 BufferedImage是否支持透明像素取决于BufferedImage类型。使用BufferedImage加载ImageIO后,您几乎不知道图像的类型。但是你可以通过将图像传递给这样的方法,轻松地将图像转换为具有已知类型(支持透明度)的图像:

public static BufferedImage convertToARGB(BufferedImage image)
{
    BufferedImage newImage = new BufferedImage(
        image.getWidth(), image.getHeight(),
        BufferedImage.TYPE_INT_ARGB);
    Graphics2D g = newImage.createGraphics();
    g.drawImage(image, 0, 0, null);
    g.dispose();
    return newImage;
}