java去除图片底色(纯色背景)

Shaka 2月前 ⋅ 56 阅读

 

最近有个需求是去掉图片PNG底色,我没做过,所以网上搜了一下.

找到了一段代码没有备注,所以我添加了备注.

为了方便自己,也方便他人.

可能只有我不理解.....因为没接触过图片处理.

结果很重要,但是过程也同样重要.

@Test
public void imageMatting(){ //英文不好 还在练习命名
File file = new File("D:\\签名\\签名.png");
InputStream is;
try {
is = new FileInputStream(file);
//BufferedImage可将图片从磁盘读取到内存中的缓冲区,利用缓冲区对图片进行各种操作.
BufferedImage bi = ImageIO.read(is);
ImageIcon imageIcon = new ImageIcon(bi);
BufferedImage bufferedImage = new BufferedImage(imageIcon.getIconWidth(), imageIcon.getIconHeight(),
//表示一个具有8位rgba颜色分量的图像具有用3字节存储的blue、green和red颜色以及1字节的alpha
BufferedImage.TYPE_4BYTE_ABGR);
//Graphics2D提供了对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制。
Graphics2D g2D = (Graphics2D) bufferedImage.getGraphics();
//在指定位置并且按指定大小绘制指定的 Image 的指定部分
g2D.drawImage(imageIcon.getImage(), 0, 0, imageIcon.getImageObserver());
int alpha = 0;
for (int j1 = bufferedImage.getMinY(); j1 < bufferedImage.getHeight(); j1++) {
for (int j2 = bufferedImage.getMinX(); j2 < bufferedImage.getWidth(); j2++) {
//获取每个位置的RGB值
int rgb = bufferedImage.getRGB(j2, j1);

//十六进制0X00RRGGBB转换argb a>>24 | r>>16 | g>>8 | b
int R = (rgb & 0xff0000) >> 16;//红色=(255,0,0)或0x00FF0000
int G = (rgb & 0xff00) >> 8; //绿色=(0,255,0)或0x0000FF00
int B = (rgb & 0xff); //绿色=(255,255,255)或0x00FFFFFF
//RGB超过225,225,225(灰色-白色)就把RGB设置为透明
if (((255 - R) < 30) && ((255 - G) < 30) && ((255 - B) < 30)) {
//rbg=透明
rgb = ((alpha + 1) << 24) | (rgb & 0x00ffffff);
}
//设置RGB
bufferedImage.setRGB(j2, j1, rgb);
}
}
//绘制图形.
g2D.drawImage(bufferedImage, 0, 0, imageIcon.getImageObserver());
// 直接输出文件
ImageIO.write(bufferedImage, "png", new File("D:\\签名\\签名1.png"));
} catch (Exception e) {
e.printStackTrace();
}
}

 


注意:本文归作者所有,未经作者允许,不得转载

全部评论: 0

    我有话说: