Java图片改透明背景

842 阅读1分钟

项目上遇到需要将.jpg图片改成png透明背景的图片,同时要去掉黑边的需求。

实现原理及步骤如下

将待处理图片转成BufferedImage对象

BufferedImage bufferedImage = ImageIO.read(path);

####将原图片的二进制转化为ImageIcon并获取RGB

Image image = (Image) bufferedImage;
//将原图片的二进制转化为ImageIcon
ImageIcon imageIcon = new ImageIcon(image);
int width = imageIcon.getIconWidth();
int height = imageIcon.getIconHeight();
//这个背景底色的选择,我这里选择的是比较偏的位置,可以修改位置。
int RGB=bufferedImage.getRGB(width-1, height-1);

遍历图片对象每个像素点进行处理

对image的每个像素点进行遍历处理,获得每个像素点的rgb颜色。判断当前rgb是否为匹配的rgb,如果是就换成透明色。我们可以取图片边缘的颜色作为匹配对象。

int alpha = 255;
// 遍历Y轴的像素
for (int y = bufferedImage.getMinY(); y < bufferedImage.getHeight(); y++) {
    // 遍历X轴的像素
    for (int x = bufferedImage.getMinX(); x < bufferedImage.getWidth(); x++) {
        int rgb = bufferedImage.getRGB(x, y);
        int r = (rgb & 0xff0000) >>16;
        int g = (rgb & 0xff00) >> 8;
        int b = (rgb & 0xff);
        int R = (RGB & 0xff0000) >>16;
        int G = (RGB & 0xff00) >> 8;
        int B = (RGB & 0xff);
        //a为色差范围值,渐变色边缘处理,数值需要具体测试,50左右的效果比较可以
        int a = 15;
        if(Math.abs(R-r) < a && Math.abs(G-g) < a && Math.abs(B-b) < a ) {
            alpha = 0;
        } else {
            alpha = 255;
        }
        rgb = (alpha << 24) | (rgb & 0x00ffffff);
        bufferedImage2.setRGB(x, y, rgb);
    }
}

将bufferedImage写入png文件中

ImageIO.write(bufferedImage2, "png", new File(outPath));

以下是处理效果前后对比

image.png

image.png

大功告成