ImgUtil 图片处理工具类,文字提取,图片水印

咸来无事,整理了一些可能会用到的 图片处理工具,↓
<!-- https://mvnrepository.com/artifact/net.sourceforge.tess4j/tess4j 图像识别 -->
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>4.5.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.12</version>
        </dependency>
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.springframework.util.ResourceUtils;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @description: 图片处理工具类
 * @author: hexiaoshu
 **/
@Slf4j
public class ImgUtil {


    /**
     * 图片内容提取,数字以前单次读取较准确,中文需要训练
     * @param imgPath       图片路径
     * @param languagePath  语言库路径
     * @param language      语言,默认英文 chi_sim 中文, eng 英文
     * @param rectangle     坐标范围,可选
     * @return Content
     */
    public static String readImg(String imgPath,String languagePath,String language,Rectangle rectangle){
        File file = new File(imgPath);
        if (!file.exists()){
            return "图片路径不存在";
        }
        ITesseract instance = new Tesseract();
        instance.setDatapath(languagePath);
        if (language==null || language.isEmpty()){
            instance.setLanguage("eng");
        }
        String result = "";
        try {
            if (rectangle==null){
                result =  instance.doOCR(file);
            }else {
                result =  instance.doOCR(file ,rectangle);
            }
        } catch (TesseractException e) {
            e.printStackTrace();
        }
        return result;
    }


    /** 设置文字水印
     * @param sourceImg 源图片路径
     * @param targetImg 保存的图片路径
     * @param watermark 水印内容
     * @param color 水印颜色 new Color(255,255,255,128)
     * @param font 水印字体  new Font("04b_08", Font.PLAIN, 30)
     * @throws IOException
     */
    public static boolean addWatermark(String sourceImg, String targetImg, String watermark,Color color,Font font){
        File srcImgFile = new File(sourceImg);
        Image srcImg;
        try {
            srcImg=ImageIO.read(srcImgFile);
        }catch (IOException e){
            return false;
        }
        int srcImgWidth = srcImg.getWidth(null);
        int srcImgHeight = srcImg.getHeight(null);
        BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bufImg.createGraphics();
        g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
        g.setColor(color);
        g.setFont(font);
        //设置水印的坐标
        int x = srcImgWidth - (g.getFontMetrics(g.getFont()).charsWidth(watermark.toCharArray(), 0, watermark.length())+20);
        int y = srcImgHeight - 25;
        //加水印
        g.drawString(watermark, x, y);
        g.dispose();
        // 输出图片
        FileOutputStream outImgStream;
        try {
            outImgStream = new FileOutputStream(targetImg);
            ImageIO.write(bufImg, "jpg", outImgStream);
            outImgStream.flush();
            outImgStream.close();
        }catch (IOException e){
            return false;
        }
        return true;
    }

    /**
     * 获取跟目录---与jar包同级目录的upload目录下指定的子目录subdirectory
     * @param subdirectory  子目录
     * @return
     */
    public static String  getJarPath(String subdirectory){
        File upload;
        try {
            //本地测试时获取到的是"工程目录/target/upload/subdirectory
            File path = new File(ResourceUtils.getURL("classpath:").getPath());
            if(!path.exists()) {
                path = new File("");
            }
            upload = new File(path.getAbsolutePath(),subdirectory);
            if(!upload.exists()) {
                upload.mkdirs();
            }
            return upload + File.separator;
        } catch (FileNotFoundException e) {
            throw new RuntimeException("获取服务器路径发生错误!");
        }
    }

    /**
     * 为图片添加图片水印
     * @param watermarkUrl 水印图片
     * @param source  原图
     * @param output 制作完成的图片
     * @return boolean
     */
    public static boolean markImgMark(String watermarkUrl, String source, String output){
        File file = new File(source);
        Image img;
        try {
            img = ImageIO.read(file);
        }catch (IOException e){
            e.printStackTrace();
            return false;
        }
        String thumbnailName = "";
        String thumbnailPath = "";
        String path = getJarPath("thumbnail_img");
        int width = img.getWidth(null);
        int height = img.getHeight(null);
        BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g = bi.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g.drawImage(img.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
        ImageIcon imgIcon = new ImageIcon(watermarkUrl);
        int waterHeight = imgIcon.getImage().getHeight(null);
        int waterWidth = imgIcon.getImage().getWidth(null);
        if ( (waterHeight+waterWidth) > 400){
            log.info("调整水印图片");
            thumbnailName ="Thumbnail.png";
            thumbnailPath=path+File.separator+thumbnailName;
            ImgUtil.creatThumbnail(watermarkUrl, thumbnailPath,100,100);
            imgIcon = new ImageIcon(thumbnailPath);
        }
        Image con = imgIcon.getImage();
        float clarity = 0.6f;
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, clarity));
        g.drawImage(con, 10, 10, null);
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
        g.dispose();
        File sf = new File(output);
        try {
            ImageIO.write(bi, "jpg", sf);
        }catch (IOException e){
            e.printStackTrace();
            return false;
        }
        if (!thumbnailName.isEmpty()){
            File file1 = new File(thumbnailPath);
            file1.delete();
        }
        return true;
    }


    /**
     * 生成缩略图
     * @param sourceImg 原图片
     * @param outImg    生成图片
     * @param width and height     图片宽高
     * @return boolean
     */
    public static boolean creatThumbnail(String sourceImg,String outImg,int width,int height){
        File originalImg = new File(sourceImg);
        File thumbnailImg = new File(outImg);
        Thumbnails.Builder<File> builder = Thumbnails.of(originalImg).size(width, height).outputQuality(0.5f);
        try {
            builder.toFile(thumbnailImg);
        }catch (IOException e){
            e.printStackTrace();
            return false;
        }
        return true;
    }


}

tess4j 语言库 中文-英文.rar ,中文需要自个调整。
我觉得读取什么,身份证号码,驾驶证什么的,完全没有问题,而且还可以根据图片像素坐标提取, 问题不大。
链接:https://pan.baidu.com/s/1uSDw_dBpy9jmSpAcqkBYsA
提取码:fkq8
在这里插入图片描述
下次再添加。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值