Java实现证件照简单换背景

Java实现证件照简单换背景(粗制)

1、前言

以下算法只能由一种纯色背景粗略更换为另一种纯色背景,以下将背景由蓝色转为白色。
基本原理是读取原图片的像素矩阵的argb值,如果在蓝色区域附近,就将它替换为白色。
使用ImageIO.read(file)读入原图片

2、算法

  • 先使用在线取色取出蓝色背景的大致的rbg值 blue_RBG,图片取色器/拾色器—菜鸟工具
  • 当读取原图片,并遍历它像素矩阵,若有像素点的rgb值在蓝色blue_RBG附近,则将它转为白色。比如我的待转换的图片的背景RGB值约为R:25 G:112 B:196。就用Math.abs(r-25)<=30&&Math.abs(g-112)<=30&&Math.abs(b-196)<=30来判断像素点的颜色是否与背景接近,如果为true就表明是蓝色背景的一部分。就将它换成白色的RGB.30是误差范围,可以自定义调节。
    在这里插入图片描述

3、将背景由蓝色转为白色源码

package filetest.image;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class ImageBackgroundBlueToWhite {
    static int h,w;
    public static void main(String[] args)throws Exception {
        String filename = "D:" + File.separator + "\\myfile\\Desktop\\dogblue.jpg";// separator是File里的一个常量,由于java历史遗留问题故为小写
        File file = new File(filename);
        BufferedImage bi = ImageIO.read(file);
        // 获取当前图片的高,宽,ARGB
        h = bi.getHeight();
        w = bi.getWidth();
        int arr[][] = new int[w][h];
        BufferedImage bufferedImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);//  构造一个类型为预定义图像类型之一的 BufferedImage,
        // 获取图片每一像素点的灰度值
        for (int i = 0; i < w; i++) {
            for (int j = 0; j < h; j++) {
                // getRGB()返回默认的RGB颜色模型(十进制)
                boolean is_Blue = isBlueAvg(i,j,bi);//该点的灰度值
                //int hui=Integer.parseInt(Integer.toHexString(bi.getRGB(i, j)),16);
                if(is_Blue){
                    int white = new Color(255, 255, 255,255).getRGB();
                    bufferedImage.setRGB(i, j, white);
                }
                else{
                    bufferedImage.setRGB(i, j, bi.getRGB(i, j));
                }
            }

        }
        ImageIO.write(bufferedImage, "png", new File("D:" + File.separator + "\\myfile\\Desktop\\dogwhileback.png"));
    }
    private static boolean isBlueAvg(int i,int j,BufferedImage bi) {
        boolean result=false;
        int r,g,b;
        String argb = Integer.toHexString(bi.getRGB(i,j));// 将十进制的颜色值转为十六进制
        // argb分别代表透明,红,绿,蓝 分别占16进制2位
        r= Integer.parseInt(argb.substring(2, 4),16);/
        g =Integer.parseInt(argb.substring(4, 6),16);
        b= Integer.parseInt(argb.substring(6, 8),16);
        if(Math.abs(r-25)<=30&&Math.abs(g-112)<=30&&Math.abs(b-196)<=30){
            result=true;
        }
        return result;
    }
}

4、效果

转换前:
转换前的图片
转换后的图片:
在这里插入图片描述
整体上可以实现将蓝色背景转换成白色,但是细节处理还是很粗糙。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值