项目上遇到需要将.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));