Java实现抠图片文字或签名的完整代码
作者:卑微小钟 时间:2023-04-18 00:04:44
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");
}
}
来源:https://blog.csdn.net/zhongjianboy/article/details/125423018
标签:java,抠图,签名
0
投稿
猜你喜欢
C#实现保存文件时重名自动生成新文件的方法
2022-07-02 15:01:57
浅谈resultMap的用法及关联结果集映射
2022-12-25 17:42:21
SpringSecurity Jwt Token 自动刷新的实现
2022-04-28 18:49:45
HighCharts图表控件在ASP.NET WebForm中的使用总结(全)
2022-07-13 02:11:12
C# 抽象类,抽象属性,抽象方法(实例讲解)
2022-03-14 09:22:16
Android内部存储改变读取权限的方法
2021-09-05 13:04:40
使用log4j MDC实现日志追踪
2022-01-13 13:20:01
Android实现自定义带文字和图片Button的方法
2021-06-20 17:13:50
native.js获取手机硬件基本信息实例代码android版
2023-10-19 13:33:09
C#设置Word文档背景的三种方法(纯色/渐变/图片背景)
2022-07-08 01:33:09
springboot实现返回文件流
2023-04-04 22:19:22
java运行windows的cmd命令简单代码
2021-06-12 11:50:47
SpringBoot在Controller层接收参数的n种姿势(超详细)
2023-01-28 00:54:39
Android实现Window弹窗效果
2022-12-07 21:48:16
springboot使用redis对单个对象进行自动缓存更新删除的实现
2023-06-30 19:14:36
java集合求和最大值最小值示例分享
2022-10-11 04:15:10
java控制线程运行
2023-03-05 15:35:30
Android实现记事本功能(26)
2023-02-17 22:30:23
java中的this引用及对象构造初始化
2023-03-07 09:38:17
微信小程序与AspNetCore SignalR聊天实例代码
2022-12-21 01:29:06