在BufferedImage上制作某种颜色变得透明

时间:2011-09-13 17:28:07

标签: java

一个非常类似的问题已经回答:How to make a color transparent in a BufferedImage and save as PNG

不幸的是,我无法从该来源中为自己制定答案。

问:我在我的Canvas中绘制了一个BufferedImage,并且只想创建一个方法,用一定颜色转动每个像素(在这种情况下:[214,127,255] / 0xD67FFF )变成透明的。 BufferedImage的类型为ARGB。

我不想将BufferedImage保存为文件,只需将其显示在画布上即可。

提前致谢。

2 个答案:

答案 0 :(得分:4)

迭代所有像素并执行检查并使其透明。

for (int y = 0; y < image.getHeight(); ++y) {
    for (int x = 0; x < image.getWidth(); ++x) {
         int argb = image.getRGB(x, y);
         if ((argb & 0x00FFFFFF) == 0x00D67FFF)
         {
              image.setRGB(x, y, 0);
         }
    }
}

确保BufferedImage使用alpha通道,否则它将变为黑色 请注意,这会影响原始图像。

编辑:请注意,我更改了支票。因此,我认为你的像素是实心的(alpha = 255)。


(0xFFD67FFF & 0x00FFFFFF) will result in 0x00D67FFF
And, (0x00D67FFF == 0x00D67FFF)

答案 1 :(得分:0)

对于完整的解决方案,例如加载,处理和编写,您可以使用以下代码:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class TransparentConverter {

    private static final Color backColor = Color.GREEN;
    private static final int THRESHOLD = 70;
    private static final int TRANSPARENT = 0;  // 0x00000000;

    static File base  = new File("C:\\images");
    static File base2 = new File("C:\\images2");

    public static void main(String[] args) throws IOException {
        System.out.println("TransparentConverter.main()");

        for (File file : base.listFiles()) {
            System.out.println(file);
            BufferedImage initImage = ImageIO.read(file);
            int width = initImage.getWidth(null),
                height = initImage.getHeight(null);

            BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
            Graphics g = image.getGraphics();
            g.drawImage(initImage, 0, 0, null);

            //System.out.println("before: " + image.getRGB(0, 0));
            for (int y = 0; y < height; y++) {
                for (int x = 0; x < width; x++) {
                    int pixel = image.getRGB(x, y);
                    Color color = new Color(pixel);

                    int dr = Math.abs(color.getRed()   - backColor.getRed()),
                        dg = Math.abs(color.getGreen() - backColor.getGreen()),
                        db = Math.abs(color.getBlue()  - backColor.getBlue());

                    if (dr < THRESHOLD && dg < THRESHOLD && db < THRESHOLD) {
                        image.setRGB(x, y, TRANSPARENT);
                    }
                }
            }
            //System.out.println("   after: " + image.getRGB(0, 0));

            file = new File(base2, file.getName());
            //System.out.println("   " + file);
            ImageIO.write(image, "png", file);
        }
    }
}