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);}}}// 生成图片为pngimageio.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"); }}
以上就是java怎么实现抠图片文字或签名的详细内容。
