/*
* 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>