首頁 > Java > java教程 > 主體

Java怎麼實作摳圖片文字或簽名

PHPz
發布: 2023-05-12 16:40:06
轉載
1621 人瀏覽過

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");
    }
}
登入後複製

以上是Java怎麼實作摳圖片文字或簽名的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:yisu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板