첫 번째 단계는 픽셀을 순회하는 것입니다
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"); } }
위 내용은 Java에서 그림 텍스트나 서명을 잘라내는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!