java抠图片文字或签名

11 篇文章 0 订阅
6 篇文章 0 订阅

java抠图片文字或签名

运行原理

  • 第一步 遍历像素点

    BufferedImage image = ImageIO.read(new File(input));
    // 图片透明度
    int alpha = 0;
    // 最小
    int maxX = 0, maxY = 0;
    // 最大
    int minX = image.getWidth(), minY = image.getHeight();
    
    for (int y = image.getMinY(); y < image.getHeight(); y++) {
    // 内层遍历是X轴的像素
    for (int x = image.getMinX(); x < image.getWidth(); x++) {
    int rgb = image.getRGB(x, y);
    // 对当前颜色判断是否在指定区间内
    if (!colorInRange(rgb)) {
    minX = minX > x ? x : minX;
    minY = minY > y ? y : minY;
    maxX = maxX < x ? x : maxX;
    maxY = maxY < y ? y : maxY;
    }
    }
    }
    
  • 第二步 判断像素是否是黑色或者指定颜色

    // 判断是背景还是内容
    public static boolean colorInRange(int color) {
    // 获取color(RGB)中R位
    int red = (color & 0xff0000) >> 16;
    // 获取color(RGB)中G位
    int green = (color & 0x00ff00) >> 8;
    // 获取color(RGB)中B位
    int blue = (color & 0x0000ff);
    // 通过RGB三分量来判断当前颜色是否在指定的颜色区间内
    if (red >= color_range && green >= color_range && blue >= color_range) {
    return true;
    }
    return false;
    }
    
  • 第三步 统计 选取图像的像素点最小坐标或最大坐标

    minX = minX > x ? x : minX;
    minY = minY > y ? y : minY;
    maxX = maxX < x ? x : maxX;
    maxY = maxY < y ? y : maxY;
    
  • 第四步 新建画布(长度和高度=最大像素点-最小像素点)

    BufferedImage bufferedImage = new BufferedImage(maxX - minX, maxY - minY, BufferedImage.TYPE_4BYTE_ABGR);
    
  • 第五步 画图

    for (int x = bufferedImage.getMinX(); x < bufferedImage.getWidth(); x++) {
    // 内层遍历是X轴的像素
    for (int y = bufferedImage.getMinX(); y < bufferedImage.getHeight(); y++) {
    int rgb = image.getRGB(x + minX, y + minY);
    if (!colorInRange(rgb)) {
    // 设置为不透明
    alpha = 255;
    // #AARRGGBB 最前两位为透明度
    rgb = (alpha << 24) | (0x000000);//黑色构图
    bufferedImage.setRGB(x, y, rgb);
    }
    }
    }
    
    // 生成图片为PNG
    ImageIO.write(bufferedImage, "png", new File(output));
    // 输出图片坐标
    System.out.println(minX + " " + minY + " " + maxX + " " + maxY);
    

完整代码

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

public class Main {
    //识别颜色度数
    public static int color_range = 100;

    public static void recognize(String input, String output) throws IOException {
        BufferedImage image = ImageIO.read(new File(input));
        // 图片透明度
        int alpha = 0;
        // 最小
        int maxX = 0, maxY = 0;
        // 最大
        int minX = image.getWidth(), minY = image.getHeight();

        for (int y = image.getMinY(); y < image.getHeight(); y++) {
            // 内层遍历是X轴的像素
            for (int x = image.getMinX(); x < image.getWidth(); x++) {
                int rgb = image.getRGB(x, y);
                // 对当前颜色判断是否在指定区间内
                if (!colorInRange(rgb)) {
                    minX = minX > x ? x : minX;
                    minY = minY > y ? y : minY;
                    maxX = maxX < x ? x : maxX;
                    maxY = maxY < y ? y : maxY;
                }

            }
        }
        BufferedImage bufferedImage = new BufferedImage(maxX - minX, maxY - minY, BufferedImage.TYPE_4BYTE_ABGR);
        for (int x = bufferedImage.getMinX(); x < bufferedImage.getWidth(); x++) {
            // 内层遍历是X轴的像素
            for (int y = bufferedImage.getMinX(); y < bufferedImage.getHeight(); y++) {
                int rgb = image.getRGB(x + minX, y + minY);
                if (!colorInRange(rgb)) {
                    // 设置为不透明
                    alpha = 255;
                    // #AARRGGBB 最前两位为透明度
                    rgb = (alpha << 24) | (0x000000);//黑色构图
                    bufferedImage.setRGB(x, y, rgb);
                }
            }
        }

        // 生成图片为PNG
        ImageIO.write(bufferedImage, "png", new File(output));
        // 输出图片坐标
        System.out.println(minX + " " + minY + " " + maxX + " " + maxY);
    }

    // 判断是背景还是内容
    public static boolean colorInRange(int color) {
        // 获取color(RGB)中R位
        int red = (color & 0xff0000) >> 16;
        // 获取color(RGB)中G位
        int green = (color & 0x00ff00) >> 8;
        // 获取color(RGB)中B位
        int blue = (color & 0x0000ff);
        // 通过RGB三分量来判断当前颜色是否在指定的颜色区间内
        if (red >= color_range && green >= color_range && blue >= color_range) {
            return true;
        }
        return false;
    }

    public static void main(String[] args) throws IOException {
        recognize("E:/tmp/demo1.jpg","E:/tmp/demo1_1.jpg");
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卑微小钟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值