ImgUtil工具类

/*
 * Copyright (c) 2006 - 2022, wzt.cn All rights reserved.
 *
 */
package cn.wzt;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeReader;
import com.google.zxing.qrcode.QRCodeWriter;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

/**
 * <p>Project: app2022 - ImgUtil
 * <p>Powered by lenovo on 2022-02-06 14:39
 * <P>Created by IntelliJ IDEA
 *
 * @author lenovo
 * @version 1.0
 * @since 17
 */
public class ImgUtil {

    /**
    * @Description: 图片水印
    * @Param: [filebg图片名, fileyt水印图片, sctp生成图片]
    * @return: void
    * @Author: wzt
    * @Date: 2022/2/6 16:10
    */
    public void shuiyint(String filebg,String fileyt,String sctp){
        BufferedImage bustr = null;
        BufferedImage sy=null;
        try {
            bustr = ImageIO.read(new File(filebg));
            sy = ImageIO.read(new File(fileyt));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Graphics2D g = bustr.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
        g.setColor(Color.YELLOW);
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,.5f));

        g.drawImage(sy,10,10,200,200,null);
        g.dispose();
        try {
            ImageIO.write(bustr,sctp.substring(sctp.lastIndexOf(".")+1),new File(sctp));
            //Runtime runtime = Runtime.getRuntime();
            //runtime.exec("cmd /k start "+sctp);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    /**
    * @Description: 字符串水印
    * @Param: [file图片名, synr水印内容, sctp生成图片]
    * @return: void
    * @Author: wzt
    * @Date: 2022/2/6 16:08
    */
    public void shuiyinz(String file,String synr,String sctp){
        BufferedImage bustr = null;
        try {
            bustr = ImageIO.read(new File(file));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Graphics2D g = bustr.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
        g.setColor(Color.WHITE);
        //        //系统字体,字体样式,大小
        //        Font font = new Font("微软雅黑", Font.BOLD, 50);
        //        g.setFont(font);
        //加载系统外字体
        var jiazai = Thread.currentThread().getContextClassLoader().getResourceAsStream("czsfyj.ttf");
        try {
            //引用系统外部字体
            Font font = Font.createFont(Font.TRUETYPE_FONT, jiazai).deriveFont(20f);
            g.setFont(font);
            //写入
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,.5f));
            g.drawString(synr,20,80);
            g.dispose();
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        g.dispose();
        try {
            ImageIO.write(bustr,sctp.substring(sctp.lastIndexOf(".")+1),new File(sctp));
            //Runtime runtime = Runtime.getRuntime();
            //runtime.exec("cmd /k start "+sctp);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description: 条形码
     * 二维码组件 javase
    * @Param: [name名称, content内容, width, height]
    * @return: void
    * @Author: wzt
    * @Date: 2022/2/6 15:12
    */
    public void txm(String name,String content,int width,int height){
        BitMatrix bm = null;
        BufferedImage bar2=null;
        try {
            bm = new MultiFormatWriter().encode(content, BarcodeFormat.EAN_13, width, height);
            MatrixToImageWriter.writeToStream(bm, name.substring(name.lastIndexOf(".")+1), new FileOutputStream(name));
            bar2 = ImageIO.read(new File(name));
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        BufferedImage bar = new BufferedImage(bar2.getWidth(), bar2.getHeight() + 30, 1);

        Graphics2D g = bar.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);

        g.setColor(Color.WHITE);
        g.fillRect(0, 0, bar2.getWidth(), bar2.getHeight() + 30);
        g.drawImage(bar2, 0, 15, bar2.getWidth(), bar2.getHeight(), null);
        g.fillRect(62, 100, 85, 15);
        g.fillRect(155, 100, 83, 15);
        g.setColor(Color.BLACK);
        g.setFont(new Font("", Font.PLAIN, 22));
        g.drawString(content.substring(0, 1), 40, 120);
        g.drawString(content.substring(1, 7), 68, 120);
        g.drawString(content.substring(7), 158, 120);
        g.dispose();
        try {
            ImageIO.write(bar, name.substring(name.lastIndexOf(".")+1), new File(name));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description:验证码
     * 二维码组件 javase
    * @Param: [name验证码名, it画布, iw宽, ih高]
    * @return: void
    * @Author: wzt
    * @Date: 2022/2/6 16:24
    */
    public void yzm(String name,int it,int iw,int ih){
        //int iw=160;int ih=60;int it=2;String il="图片类型";String im="图片名";
        BufferedImage bustr = new BufferedImage(iw,ih,it);
        Graphics2D g = bustr.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
        g.setColor(Color.WHITE);
        g.fillRect(0,0,iw,ih);
        String s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        Random rand = new Random();
        //系统字体,字体样式,大小
        Font font = new Font("微软雅黑", Font.BOLD, 50);
        //g.setFont(font);
        //加载系统外字体
        var jiazai = Thread.currentThread().getContextClassLoader().getResourceAsStream("czsfyj.ttf");//需自己下载外部字体
        try {
            //引用系统外部字体
            font = Font.createFont(Font.TRUETYPE_FONT, jiazai);
        } catch (FontFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        //写入,背景
        for (int n = 0; n < 20; n++) {
            font = font.deriveFont(Font.PLAIN, rand.nextFloat() * 15 + 15);
            g.setFont(font);
            g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255), rand.nextInt(10) + 50));
            int x = rand.nextInt(iw);
            int y = rand.nextInt(ih);
            g.drawString(String.valueOf(s.charAt(rand.nextInt(s.length()))), x, y);
        }
        //写入,验证码
        double radianPercent = 0D;
        StringBuilder sb = new StringBuilder(5);
        g.setColor(new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255),rand.nextInt(25)+200));
        for (int i = 0; i < 4; i++) {
            font=font.deriveFont(rand.nextFloat()*35+30);
            g.setFont(font);
            FontMetrics fm = g.getFontMetrics(font);
            int x = i * 32 + 5;
            int y = rand.nextInt(20)+(ih+(fm.getAscent()-fm.getDescent()))/2-15;
            radianPercent = Math.PI * (rand.nextInt(35) / 180D);//旋转角度
            if (rand.nextBoolean())//从该随机数生成器的序列中返回下一个伪随机、均匀分布的布尔值
                radianPercent = -radianPercent;
            g.rotate(radianPercent, x, y);//正旋转
            String sss = String.valueOf(s.charAt(rand.nextInt(s.length())));
            sb.append(sss);
            g.drawString(sss, x, y);
            g.rotate(-radianPercent, x, y);//负旋转
        }
        //写入,曲线
        Point[] points = { new Point(0, 0), new Point(10, 50), new Point(30, 6), new Point(60, 55), new Point(80, 3),
                new Point(160, 60)
        };

        GeneralPath path = new GeneralPath();
        path.moveTo(points[0].x, points[0].y);
        for (int i2 = 0; i2 < points.length - 1; ++i2) {
            Point sp = points[i2];
            Point ep = points[i2 + 1];
            Point c1 = new Point((sp.x + ep.x) / 2, sp.y);
            Point c2 = new Point((sp.x + ep.x) / 2, ep.y);
            path.curveTo(c1.x, c1.y, c2.x, c2.y, ep.x, ep.y);
        }
        g.setStroke(new BasicStroke(rand.nextInt(6) + 2));
        // g.draw(path);

        g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), rand.nextInt(255), rand.nextInt(25) + 220));
        int yy = rand.nextInt(15) + 15;// 起点y坐标
        int hh = rand.nextInt(20) + 10;// 高度
        int aa = rand.nextInt(60) + 20;//宽度
        // x
        for (int x = 10; x < iw; x++) {
            int y = (int) (yy + hh * Math.sin(x * Math.PI / aa));
            // g.drawLine(x, (int) y, x, (int) y);
            g.fillOval(x, y, 3, 3);
        }

        // 输出验证码
        System.out.println(sb.toString());

        g.dispose();
        try {
            ImageIO.write(bustr,name.substring(name.lastIndexOf(".")+1),new File(name));
            //名字随机,适合循环调用生成多个验证码
            //String mz= UUID.randomUUID().toString().toLowerCase(Locale.ROOT);
            //ImageIO.write(bustr,"png",new File(mz+".png"));
            //Runtime runtime = Runtime.getRuntime();
            //runtime.exec("cmd /k start "+name);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description: 生成二维码
     * 二维码组件 javase
     * @Param: [leibie, mingcheng]
     * @return: void
     * @Author: wzt
     * @Date: 2022/1/24 11:21
     */
    public void evm(String name, String nr){
        //防止乱码
        Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>();
        hints.put(EncodeHintType.MARGIN, 2);
        hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
        //生成QRcode
        BitMatrix bm = null;
        try {
            bm = new QRCodeWriter().encode(nr, BarcodeFormat.QR_CODE, 200, 200);
            var i = MatrixToImageWriter.toBufferedImage(bm);
            ImageIO.write(i, name.substring(name.lastIndexOf(".")+1), new FileOutputStream(name));
        } catch (WriterException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description: 设置二维码颜色
     * 二维码组件 javase
     * @Param: [mingcheng]
     * @return: void
     * @Author: wzt
     * @Date: 2022/1/24 11:22
     */
    public void evmys(String mingcheng){
        //设置二维码颜色
        BufferedImage read = null;
        try {
            read = ImageIO.read(new File(mingcheng));
        } catch (IOException e) {
            e.printStackTrace();
        }
        BufferedImage bfi = new BufferedImage(200, 200, 1);
        Graphics g = bfi.getGraphics();
        g.drawImage(bfi,0,0,200,200,null);
        Random rand=new Random();
        Color c = new Color(rand.nextInt(255),rand.nextInt(255),rand.nextInt(255),rand.nextInt(255));
        for (int x = 0; x < 200; x++) {
            for (int y = 0; y < 200; y++) {
                //setRGB()将此 BufferedImage 中的像素设置为指定的 RGB 值
                bfi.setRGB(x, y, read.getRGB(x,y)==-1 ? 0xffffffff : c.getRGB());
            }
            //if(x>5) break;
        }
    }

    /**
     * @Description: 读取二维码
     * 二维码组件 javase
     * @Param: [mingcheng]
     * @return: void
     * @Author: wzt
     * @Date: 2022/1/24 11:22
     */
    public void dqevm(String mingcheng){
        //读取QRcode
        BufferedImage img = null;
        try {
            img = ImageIO.read(new File(mingcheng));
            var src = new BufferedImageLuminanceSource(img);
            var binarizer = new HybridBinarizer(src);
            var binaryBitmap = new BinaryBitmap(binarizer);
            var result = new QRCodeReader().decode(binaryBitmap);
            System.out.println(result.getText());
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ChecksumException e) {
            e.printStackTrace();
        } catch (NotFoundException e) {
            e.printStackTrace();
        } catch (FormatException e) {
            e.printStackTrace();
        }
    }

    /**
     * @Description: 缩略图片
     * 图像操作组件 thumbnailator
     * @Param: [mbtp目标图片, w宽, h高, sctp生成图片]
     * @return: void
     * @Author: wzt
     * @Date: 2022/1/25 17:08
     */
    public void sltp(final String mbtp, final int w, final int h,final String sctp) {
        try {
            BufferedImage bufferedimage = ImageIO.read(new File(mbtp));
            int type = bufferedimage.getColorModel().getTransparency();
            BufferedImage img;
            Graphics2D graphics2d;
            (graphics2d = (img = new BufferedImage(w, h, type))
                    .createGraphics()).setRenderingHint(
                    RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            graphics2d.drawImage(bufferedimage, 0, 0, w, h, 0, 0, bufferedimage
                    .getWidth(), bufferedimage.getHeight(), null);
            graphics2d.dispose();
            ImageIO.write(img,sctp.substring(sctp.lastIndexOf(".")+1),new File(sctp));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description: 旋转图片
     * 图像操作组件 thumbnailator
    * @Param: [mbtp目标图片, jd角度, sctp生成图片]
    * @return: void
    * @Author: wzt
    * @Date: 2022/1/25 16:56
    */
    public void xztp(final String mbtp, final int jd,final String sctp) {
        try {
            BufferedImage bufferedimage = ImageIO.read(new File(mbtp));
            int w = bufferedimage.getWidth();
            int h = bufferedimage.getHeight();
            int type = bufferedimage.getColorModel().getTransparency();
            BufferedImage img;
            Graphics2D graphics2d;
            (graphics2d = (img = new BufferedImage(w, h, type))
                    .createGraphics()).setRenderingHint(
                    RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            graphics2d.rotate(Math.toRadians(jd), w / 2, h / 2);
            graphics2d.drawImage(bufferedimage, 0, 0, null);
            graphics2d.dispose();
            ImageIO.write(img,sctp.substring(sctp.lastIndexOf(".")+1),new File(sctp));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description: 水平翻转图片
     * 图像操作组件 thumbnailator
    * @Param: [mbtp目标图片, sctp生成图片]
    * @return: void
    * @Author: wzt
    * @Date: 2022/1/25 17:15
    */
    public void fztp(final String mbtp,final String sctp) {
        try {
            BufferedImage bufferedimage = ImageIO.read(new File(mbtp));
            int w = bufferedimage.getWidth();
            int h = bufferedimage.getHeight();
            BufferedImage img;
            Graphics2D graphics2d;
            (graphics2d = (img = new BufferedImage(w, h, bufferedimage
                    .getColorModel().getTransparency())).createGraphics())
                    .drawImage(bufferedimage, 0, 0, w, h, w, 0, 0, h, null);
            graphics2d.dispose();
            ImageIO.write(img,sctp.substring(sctp.lastIndexOf(".")+1),new File(sctp));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description: 黑白图像
    * @Param: [ytp, sctp]
    * @return: void
    * @Author: wzt
    * @Date: 2022/2/6 16:45
    */
    public void hbtx(String ytp,String sctp){
        BufferedImage tp = null;
        BufferedImage bustr = null;
        try {
            tp = ImageIO.read(new File(ytp));
            bustr = new BufferedImage(tp.getWidth(),tp.getHeight(),10);
        } catch (IOException e) {
            e.printStackTrace();
        }
        Graphics2D g = bustr.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);

        g.drawImage(tp,0,0,tp.getWidth(),tp.getHeight(),null);
        g.setColor(new Color(0,255,0,55));
        g.fillRect(0,0, tp.getWidth(), tp.getHeight());
        g.dispose();
        try {
            ImageIO.write(bustr,sctp.substring(sctp.lastIndexOf(".")+1),new File(sctp));
            //Runtime runtime = Runtime.getRuntime();
            //runtime.exec("cmd /k start "+sctp);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
    * @Description: 截图
    * @Param: [ytp原图片, sctp生成图片, x坐标, y坐标, iw宽, ih高]
    * @return: void
    * @Author: wzt
    * @Date: 2022/2/10 9:47
    */
    public void jietu(String ytp,String sctp,int x,int y,int iw,int ih) {
        BufferedImage bustr = new BufferedImage(iw,ih,1);
        BufferedImage read=null;
        try {
            read = ImageIO.read(new File(ytp));
        } catch (IOException e) {
            e.printStackTrace();
        }
        Graphics2D g = bustr.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_GASP);
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
        g.drawImage(read,0,0,iw,ih,x,y,x+iw,y+ih,null);
        g.dispose();
        try {
            ImageIO.write(bustr,sctp.substring(sctp.lastIndexOf(".")+1),new File(sctp));
            //Runtime runtime = Runtime.getRuntime();
            //runtime.exec("cmd /k start "+sctp);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

组件配置pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>cn.wzt</groupId>
    <artifactId>08io</artifactId>
    <packaging>pom</packaging>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
    </properties>
    <dependencies>
        <!--commons-i0-->
        <!--一种新的io操作方式-->
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
        </dependency>
        <!-- com.google.zxing/javase -->
        <!-- 二维码操作组件-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
        <!--图像操作组件-->
        <dependency>
            <groupId>net.coobird</groupId>
            <artifactId>thumbnailator</artifactId>
            <version>0.4.16</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.whvcse/easy-captcha -->
        <!--验证码组件-->
        <dependency>
            <groupId>com.github.whvcse</groupId>
            <artifactId>easy-captcha</artifactId>
            <version>1.6.2</version>
        </dependency>

    </dependencies>

</project>

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值