package com.doumee.core.utils;
|
|
import com.google.zxing.common.BitMatrix;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.fileupload.FileItem;
|
import org.apache.commons.fileupload.FileItemFactory;
|
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
|
import org.apache.commons.lang3.StringUtils;
|
import org.checkerframework.checker.units.qual.C;
|
import org.springframework.http.MediaType;
|
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.commons.CommonsMultipartFile;
|
|
import javax.imageio.ImageIO;
|
import javax.imageio.stream.ImageOutputStream;
|
import java.awt.*;
|
import java.awt.geom.Ellipse2D;
|
import java.awt.geom.RoundRectangle2D;
|
import java.awt.image.BufferedImage;
|
import java.io.*;
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.net.URL;
|
|
@Slf4j
|
public class GeneratePicUtil {
|
|
static String bg="https://shoeslxkj.oss-cn-beijing.aliyuncs.com/file/20230404/SysBaseBackGround/D56231512C0B4A4C9D06B02F9566B0B0.png";
|
|
static String headUrl = "https://shoeslxkj.oss-cn-beijing.aliyuncs.com/file/20230404/SysBaseBackGround/B802B64FE31447DCB030F13ECC7CA9F9.png";
|
|
private static float jPEGcompression = 0.75f;// 图片清晰比率
|
/**
|
* test
|
*
|
* @param args
|
* @throws
|
*/
|
public static void main(String[] args) {
|
long starttime = System.currentTimeMillis();
|
System.out.println("开始:" + starttime);
|
try {
|
// String a="https://shoeslxkj.oss-cn-beijing.aliyuncs.com/file/20230403/SysBaseBackGround/883D63E108F44FC68ED856B42B9AB063.png";
|
// generateImg(a,"D:/","baidu.com","清澄白河马克杯-节日版定制日版定制", BigDecimal.valueOf(129.88) );
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
System.out.println("结束:" + (System.currentTimeMillis() - starttime) / 1000);
|
}
|
|
private static final int width = 750;
|
private static final int height = 1194;
|
|
/**
|
* 生成分享图片
|
* @param headImg 头部图片
|
* @param wxQrCodeImg 微信小程序二维码
|
* @param goodsName 商品名称
|
* @param price 商品价格
|
* @return
|
* @throws Exception
|
*/
|
public static InputStream generateImg(String headImg,String wxQrCodeImg, String goodsName, BigDecimal price) throws Exception {
|
BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
|
//得到它的绘制环境(这张图片的笔)
|
Graphics2D g2 = (Graphics2D) bi.getGraphics();
|
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
|
g2.fillRect(0, 0, width, height);
|
//背景图片
|
BufferedImage titles = ImageIO.read(new URL(bg));
|
g2.drawImage(titles, 1, 1, 894, 1305, null);
|
g2.drawRect(0, 0, width - 1, height - 1);
|
//头部图片
|
BufferedImage headBg = ImageIO.read(new URL(headImg));
|
g2.drawImage(headBg, 1, 1, 894, 900, null);
|
g2.drawRect(0, 0, width - 1, height - 1);
|
|
//商品名称
|
if(goodsName.length()>13){
|
g2.setColor(Color.black);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(goodsName.substring(0,13), 46, 1000);
|
g2.setColor(Color.black);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(goodsName.substring(13), 46, 1054);
|
}else{
|
g2.setColor(Color.black);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(goodsName, 46, 1020);
|
}
|
|
//商品价格
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString("¥", 620, 1020);
|
BigDecimal integerPart = price.setScale(0, RoundingMode.DOWN);
|
BigDecimal fractionalPart = price.subtract(integerPart);
|
if(price.compareTo(new BigDecimal(1000))>=0){
|
//整数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(price.setScale(0, RoundingMode.DOWN).toString(), 660, 1020);
|
//小数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(fractionalPart.toString().substring(1), 740, 1020);
|
}else if(price.compareTo(new BigDecimal(100))>=0){
|
//整数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(price.setScale(0, RoundingMode.DOWN).toString(), 660, 1020);
|
//小数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(fractionalPart.toString().substring(1), 720, 1020);
|
}else if(price.compareTo(new BigDecimal(10))>=0){
|
//整数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(price.setScale(0, RoundingMode.DOWN).toString(), 660, 1020);
|
//小数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(fractionalPart.toString().substring(1), 700, 1020);
|
}else{
|
//整数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(price.setScale(0, RoundingMode.DOWN).toString(), 660, 1020);
|
//小数部分
|
g2.setColor(Color.red);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(fractionalPart.toString().substring(1), 680, 1020);
|
}
|
//设置二维码图片
|
BufferedImage barcodeCode = ImageIO.read(new URL(wxQrCodeImg));
|
g2.drawImage(barcodeCode, 670, 1100, 180, 180,null);
|
g2.drawRect(0, 0, width - 1, height - 1);
|
InputStream inputStream = bufferedImageToInputStream(bi);
|
return inputStream;
|
|
}
|
|
public static MultipartFile getMultipartFile(InputStream inputStream, String fileName) {
|
FileItem fileItem = createFileItem(inputStream, fileName);
|
return new CommonsMultipartFile(fileItem);
|
}
|
|
/**
|
* FileItem类对象创建
|
*
|
* @param inputStream inputStream
|
* @param fileName fileName
|
* @return FileItem
|
*/
|
public static FileItem createFileItem(InputStream inputStream, String fileName) {
|
FileItemFactory factory = new DiskFileItemFactory(16, null);
|
String textFieldName = "file";
|
FileItem item = factory.createItem(textFieldName, MediaType.MULTIPART_FORM_DATA_VALUE, true, fileName);
|
int bytesRead = 0;
|
byte[] buffer = new byte[8192];
|
OutputStream os = null;
|
//使用输出流输出输入流的字节
|
try {
|
os = item.getOutputStream();
|
while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
|
os.write(buffer, 0, bytesRead);
|
}
|
inputStream.close();
|
} catch (IOException e) {
|
throw new IllegalArgumentException("文件上传失败");
|
} finally {
|
if (os != null) {
|
try {
|
os.close();
|
} catch (IOException e) {
|
e.printStackTrace();;
|
}
|
}
|
if (inputStream != null) {
|
try {
|
inputStream.close();
|
} catch (IOException e) {
|
e.printStackTrace();;
|
}
|
}
|
}
|
|
return item;
|
}
|
|
public static void saveFile(InputStream is, String fileName) throws IOException {
|
try (BufferedInputStream in = new BufferedInputStream(is);
|
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fileName))) {
|
int len;
|
byte[] b = new byte[1024];
|
while ((len = in.read(b)) != -1) {
|
out.write(b, 0, len);
|
}
|
}
|
}
|
|
public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage) {
|
return bufferedImageToInputStream(backgroundImage, "jpg");
|
}
|
|
/**
|
* backgroundImage 转换为输出流
|
*
|
* @param backgroundImage
|
* @param format
|
* @return
|
* @throws IOException
|
*/
|
public static InputStream bufferedImageToInputStream(BufferedImage backgroundImage, String format) {
|
ByteArrayOutputStream bs = new ByteArrayOutputStream();
|
try (
|
ImageOutputStream
|
imOut = ImageIO.createImageOutputStream(bs)) {
|
ImageIO.write(backgroundImage, format, imOut);
|
InputStream is = new ByteArrayInputStream(bs.toByteArray());
|
return is;
|
}catch (Exception e){
|
return null;
|
}
|
}
|
|
/**
|
* 传入的图像必须是正方形的 才会 圆形 如果是长方形的比例则会变成椭圆的
|
*
|
* 用户头像地址
|
* @return
|
* @throws IOException
|
*/
|
public static BufferedImage convertCircular(BufferedImage bi1) throws IOException {
|
|
BufferedImage bi2 = new BufferedImage(bi1.getWidth(), bi1.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
|
|
Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, bi1.getWidth(), bi1.getHeight());
|
|
Graphics2D g2 = bi2.createGraphics();
|
|
g2.setClip(shape);
|
|
// 使用 setRenderingHint 设置抗锯齿
|
|
g2.drawImage(bi1, 0, 0, null);
|
|
// 设置颜色
|
|
g2.setBackground(Color.green);
|
|
g2.dispose();
|
|
return bi2;
|
|
}
|
|
|
//去除二维码白边
|
public static BitMatrix deleteWhite(BitMatrix matrix) {
|
int[] rec = matrix.getEnclosingRectangle();
|
int resWidth = rec[2] + 1;
|
int resHeight = rec[3] + 1;
|
|
BitMatrix resMatrix = new BitMatrix(resWidth, resHeight);
|
resMatrix.clear();
|
for (int i = 0; i < resWidth; i++) {
|
for (int j = 0; j < resHeight; j++) {
|
if (matrix.get(i + rec[0], j + rec[1])) resMatrix.set(i, j);
|
}
|
}
|
return resMatrix;
|
}
|
public static InputStream generateUserCardImg(String imgurl, String qrcode, String name,String type, String phone
|
, String shopaddr, String shopname
|
,String phoneIcon
|
,String addrIcon
|
,String shopIcon
|
,String logoIcon) {
|
|
BufferedImage bi = new BufferedImage(750, 1194, BufferedImage.TYPE_INT_RGB);
|
//得到它的绘制环境(这张图片的笔)
|
Graphics2D g2 = (Graphics2D) bi.getGraphics();
|
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
|
g2.fillRect(0, 0, 750, 1194);
|
//背景图片
|
BufferedImage img1 =getImgIO(imgurl);
|
if(img1!=null){
|
int w = img1.getWidth();
|
int h = img1.getHeight();
|
int h1 = (int)((double)w *700/750);
|
int w1 = (int)((double)h *750/700);
|
if(h>h1){
|
h = h1;
|
}
|
if(w>w1){
|
w = w1;
|
}
|
img1 = img1.getSubimage(0,0,w,h);
|
g2.drawImage(img1, 0, 0, 750, 700, null);
|
}else{
|
g2.setColor(new Color(102, 102, 102, 1));
|
g2.drawRect( 0, 0, 750, 700);
|
}
|
|
//名称
|
if(name.length()>5){
|
name = name.substring(0,5)+"...";
|
}
|
g2.setColor(Color.black);
|
g2.setFont(new Font("黑体", Font.PLAIN, 40));
|
g2.drawString(name, 40, 742+th);
|
|
int w = 60+ name.length()* 40;
|
g2.setColor(new Color(176, 135, 113));
|
g2.drawRoundRect(w,744-10,85,50,15,15);//画一个圆角矩形
|
|
g2.setColor(new Color(176, 135, 113));
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(type, w+12, 741+th);
|
|
if(StringUtils.isNotBlank(qrcode)){
|
//个人二维码
|
BufferedImage img2 = getImgIO(qrcode);
|
if(img2!=null){
|
g2.drawImage(img2, 522, 740, 188, 188, null);
|
}
|
g2.setColor(new Color(176, 135, 113));
|
g2.setFont(new Font("黑体", Font.PLAIN, 24));
|
g2.drawString("扫码添加好友", 544, 944+th);
|
}
|
|
//手机号
|
BufferedImage img4 = getImgIO(phoneIcon);
|
if(img4!=null){
|
g2.drawImage(img4, 40, 830 , 34, 36, null);
|
}
|
g2.setColor(Color.GRAY);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(phone, 94, 828+th);
|
//门店名称
|
BufferedImage img5 = getImgIO(shopIcon);
|
if(img4!=null){
|
g2.drawImage(img5, 40, 904 , 34, 36, null);
|
}
|
if(shopname.length()>11){
|
shopname = shopname.substring(0,11)+"...";
|
}
|
g2.setColor(Color.GRAY);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(shopname, 94,901+th);
|
|
|
BufferedImage img3 = getImgIO(addrIcon);
|
if(img3!=null){
|
g2.drawImage(img3, 40, 980, 34, 36, null);
|
}
|
dealDrawShopAddr(g2,94,973+th,shopaddr);
|
//底部
|
|
BufferedImage img6 = getImgIO(logoIcon);
|
if(img6!=null){
|
g2.drawImage(img6, 254, 1126+th-20, 242, 28, null);
|
}
|
|
InputStream inputStream = bufferedImageToInputStream(bi);
|
return inputStream;
|
}
|
|
private static void dealDrawShopAddr(Graphics2D g2, int x, int y, String shopaddr) {
|
int num =shopaddr.length() / 13;
|
for (int i = 0; i <= num; i++) {
|
String temp ="";
|
if(shopaddr.length() >= (i+1)*13){
|
temp = shopaddr.substring(i*13,(i+1)*13);
|
}else{
|
temp=shopaddr.substring( i*13);
|
}
|
//地址
|
g2.setColor(Color.GRAY);
|
g2.setFont(new Font("黑体", Font.PLAIN, 30));
|
g2.drawString(temp, x, y+i*40);
|
}
|
}
|
|
public static BufferedImage getImgIO(String imgurl) {
|
try {
|
return ImageIO.read(new URL(imgurl));
|
}catch (Exception e){
|
|
}return null;
|
}
|
private static BufferedImage getImgIO(InputStream is) {
|
if(is ==null){
|
log.error("=============================qrcode error 小程序码为空");
|
}else{
|
|
log.error("=============================qrcode okay 小程序码有有數據");
|
}
|
try {
|
return ImageIO.read(is);
|
}catch (Exception e){
|
log.error("=============================qrcode error 小程序码为空11111111111:"+e.getMessage());
|
|
}
|
return null;
|
}
|
|
public static InputStream generateShareImg(String imgurl, InputStream mpCode1, String title) {
|
|
BufferedImage bi = new BufferedImage(750, 976, BufferedImage.TYPE_INT_RGB);
|
//得到它的绘制环境(这张图片的笔)
|
Graphics2D g2 = (Graphics2D) bi.getGraphics();
|
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
|
g2.fillRect(0, 0, 750, 976);
|
//背景图片
|
dealTitleCenter(g2,th,title);
|
if(StringUtils.isNotBlank(imgurl)){
|
BufferedImage img1 =getImgIO(imgurl);
|
if(img1!=null){
|
int w = img1.getWidth();
|
int h = img1.getHeight();
|
int h1 = (int)((double)w *502/670);
|
int w1 = (int)((double)h *670/502);
|
if(h>h1){
|
h = h1;
|
}
|
if(w>w1){
|
w = w1;
|
}
|
img1 = img1.getSubimage(0,0,w,h);
|
g2.drawImage(setRadius(img1,20,0,0), 40, 204, 670 ,502, null);
|
|
}
|
}
|
|
// g2.setColor(Color.white);
|
// g2.drawRoundRect(39,204, 672, 502, 1,1);//画一个圆角矩形
|
|
g2.setColor(Color.black);
|
g2.setFont(new Font("黑体", Font.BOLD, 40));
|
g2.drawString("长按识别小程序", 40,768+th);
|
g2.setColor(Color.gray);
|
g2.setFont(new Font("黑体", Font.PLAIN, 32));
|
g2.drawString("查看更多精彩内容", 40,820+th);
|
|
|
BufferedImage img3 = getImgIO(mpCode1);
|
if(img3!=null){
|
g2.setColor(Color.white);
|
g2.drawImage(img3, 530, 736, 180, 180, null);
|
}
|
InputStream inputStream = bufferedImageToInputStream(bi);
|
return inputStream;
|
}
|
|
/**
|
* 图片设置圆角
|
* @param srcImage
|
* @return
|
* @throws
|
*/
|
public static BufferedImage setRadius(BufferedImage srcImage, int radius, int border, int padding){
|
int width = srcImage.getWidth();
|
int height = srcImage.getHeight();
|
int canvasWidth = width + padding * 2;
|
int canvasHeight = height + padding * 2;
|
|
BufferedImage image = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
|
Graphics2D gs = image.createGraphics();
|
gs.setComposite(AlphaComposite.Src);
|
gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
gs.setColor(Color.WHITE);
|
gs.fill(new RoundRectangle2D.Float(0, 0, canvasWidth, canvasHeight, radius, radius));
|
gs.setComposite(AlphaComposite.SrcAtop);
|
gs.drawImage(setClip(srcImage, radius), padding, padding, null);
|
if(border !=0){
|
gs.setColor(Color.white);
|
gs.setStroke(new BasicStroke(border));
|
gs.drawRoundRect(padding, padding, canvasWidth - 2 * padding, canvasHeight - 2 * padding, radius, radius);
|
}
|
gs.dispose();
|
return image;
|
}
|
|
|
/**
|
* 图片切圆角
|
* @param srcImage
|
* @param radius
|
* @return
|
*/
|
public static BufferedImage setClip(BufferedImage srcImage, int radius){
|
int width = srcImage.getWidth();
|
int height = srcImage.getHeight();
|
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
|
Graphics2D gs = image.createGraphics();
|
|
gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
gs.setClip(new RoundRectangle2D.Double(0, 0, width, height, radius, radius));
|
gs.drawImage(srcImage, 0, 0, null);
|
gs.dispose();
|
return image;
|
}
|
|
private static void dealTitleCenter(Graphics2D g2, int th, String title) {
|
String[] titles = title.split("&");
|
for (int i = 0; i < titles.length && i<2; i++) {
|
String name = titles[i];
|
//名称
|
if(name.length()>=17){
|
name = name.substring(0,17);
|
}
|
Font font =new Font("黑体", Font.BOLD, 38);
|
FontMetrics fontMetrics = g2.getFontMetrics(font);
|
int centerX = 750 / 2;
|
int textWidth = fontMetrics.stringWidth(name);
|
g2.setColor(Color.black);
|
g2.setFont(font);
|
g2.drawString(name, centerX - textWidth / 2, 60+th+i*55);
|
}
|
}
|
public static int th = 30;
|
public static InputStream generateShareWithUserImg(BufferedImage imgurl, InputStream mpCode, String header, String name) {
|
int w = imgurl.getWidth();
|
int h = imgurl.getHeight();
|
double rate = (double)w/750d;
|
|
//得到它的绘制环境(这张图片的笔)
|
Graphics2D g2 = (Graphics2D) imgurl.getGraphics();
|
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
|
//背景图片
|
|
BufferedImage img1 =getImgIO(header);
|
if(img1!=null){
|
g2.drawImage(setRadius(img1,img1.getWidth(),0,0), (int)(20*rate), (int)(h-68*rate), (int)(48*rate) ,(int)(48*rate), null);
|
}
|
|
g2.setColor(Color.white);
|
g2.setFont(new Font("黑体", Font.PLAIN, (int)(28 * rate)));
|
g2.drawString(name, (int) (80*rate),h-(int)((64-th)*rate));
|
Font font =new Font("黑体", Font.PLAIN, (int)(24 * rate));
|
g2.setColor(Color.white);
|
g2.setFont(font);
|
FontMetrics fontMetrics = g2.getFontMetrics(font);
|
int textWidth = fontMetrics.stringWidth("扫码看更多");
|
g2.drawString("扫码看更多", (int)(w -(textWidth+20*rate)),h-(int)(rate*(50-th)));
|
|
BufferedImage img3 = getImgIO(mpCode);
|
if(img3!=null){
|
g2.setColor(Color.white);
|
g2.fillOval((int)(w-130*rate), (int)(h-rate*150), (int)(100*rate) , (int)(100*rate));
|
g2.drawImage(img3, (int)(w-130*rate), (int)(h-rate*150), (int)(100*rate) , (int)(100*rate), null);
|
}
|
InputStream inputStream = bufferedImageToInputStream(imgurl);
|
return inputStream;
|
}
|
}
|