Java将图片白色部分变成透明只保留图片非白色部分主体

    public static void main(String...args) {
        File file = new File("C:/Users/Administrator/Desktop/image");
        if (file.exists()) {
            File[] images = file.listFiles();//f -> f.getName().toLowerCase().indexOf(".bmp") != 0
            assert images != null;
            for (File image : images) {
                convertImage(image);
            }
        }
     //convertImage(new File("C:/Users/Administrator/Desktop/love.bmp"));
    }


    /**
     * 将图片白色部分透明化处理,只保留非白色部分
     * @param imageFile 图片文件
     */
    public static void convertImage(File imageFile) {
        if (imageFile == null || imageFile.isDirectory()) {
            return;
        }
        //获取image buffered
        BufferedImage image = null;
        try {
            image = ImageIO.read(imageFile);
        } catch (IOException e) {
            e.printStackTrace();
        }
        assert image != null;
        //获取图片高度
        int height = image.getHeight();
        //获取图片宽度
        int width = image.getWidth();
        //生成ImageIcon对象
        ImageIcon imageIcon = new ImageIcon(image);
        //载入原图片数据
        BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR);
        //创建画笔对象
        Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();
        //绘制Image图片
        graphics2D.drawImage(imageIcon.getImage(), 0, 0, null);
        //图片透明度
        int alpha = 0;
        //遍历图片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);
                alpha = includeColor(rgb) ? 0 : 255;
                rgb = (alpha << 24) | (rgb & 0X00FFFFFF);
                bufferedImage.setRGB(x, y, rgb);
            }
        }
        //将处理后的色块buffered对象写入缓冲区
        graphics2D.drawImage(bufferedImage, 0, 0, null);
        //创建输出路径
        File outFile = new File(imageFile.getParentFile().getPath() + "/temp/");
        //检测输出路径是否存在
        boolean exists = outFile.exists() || outFile.mkdir();
        if (exists) {
            //获取文件名不含后缀
            String fileName = imageFile.getName().substring(0, imageFile.getName().lastIndexOf("."));
            //创建输出图片文件对象
            File outImageFile = new File(outFile.getPath() + "/" + fileName + ".png");
            try {
                //输出图片
                ImageIO.write(bufferedImage, "png", outImageFile);
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            //输出
            System.out.println(outImageFile.getPath() + " 转换完成!");
        }
    }

    /**
     * 判断当前色块是否属于设定值的范围
     * @param color 当前颜色
     * @return false|true
     */
    public static boolean includeColor(int color) {
        int red = (color & 0xFF0000) >> 16;
        int green = (color & 0x00FF00) >> 8;
        int blue = (color & 0x0000FF);
        int color_range = 215;
        return (red >= color_range && green >= color_range && blue >= color_range);
    }

效果:白色部分变透明

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值