123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- package com.ygj.yuemum.service.global;
- import com.ygj.yuemum.component.Constant;
- import org.apache.commons.io.FileUtils;
- import org.apache.commons.lang.StringUtils;
- import org.springframework.stereotype.Service;
- import javax.imageio.ImageIO;
- import javax.imageio.ImageReadParam;
- import javax.imageio.ImageReader;
- import javax.imageio.stream.ImageInputStream;
- import javax.swing.*;
- import java.awt.*;
- import java.awt.geom.AffineTransform;
- import java.awt.image.BufferedImage;
- import java.io.*;
- import java.util.ArrayList;
- import java.util.Iterator;
- @Service
- public class CreatePOPService {
- public static final String LOCALQRCODE = Constant.LOCALQRCODE;
- public static final String DEMOQRCODE = Constant.DEMOQRCODE;
- public static final String HTTPOPPQRCODE = Constant.HTTPOPPQRCODE;
- public static final String HTTTESTQRCODE = Constant.HTTTESTQRCODE;
- public static final String TESTQRCODE = Constant.TESTQRCODE;
- public String CreateTestShare(String qrcode,String testImg,Integer score,String openid) throws IOException {
- File qrCodeImg = new File(LOCALQRCODE+"/"+qrcode);
- File fileBg = new File(TESTQRCODE+"/"+testImg);
- FileInputStream fis = new FileInputStream(fileBg);
- ImageIcon imageIcon = new ImageIcon(TESTQRCODE+"/"+testImg);
- int iconWidth = imageIcon.getIconWidth();
- int iconHeight = imageIcon.getIconHeight() -200;
- ImageInputStream iis = ImageIO.createImageInputStream(fileBg);
- Iterator<ImageReader> it = ImageIO.getImageReaders(iis);
- ImageReader r = it.next();
- r.setInput(iis, true);
- ImageReadParam param = r.getDefaultReadParam();
- Rectangle rect = new Rectangle(0, 0, iconWidth, iconHeight);
- param.setSourceRegion(rect);
- BufferedImage bufferedImage = r.read(0, param);
- Graphics2D g = bufferedImage.createGraphics();
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- g.drawImage(bufferedImage.getScaledInstance(iconWidth, iconHeight, Image.SCALE_SMOOTH), 0, 0, null);
- g.drawImage(ImageIO.read(qrCodeImg), 100, iconHeight-300, 200, 200, null);
- Graphics2D g2 = (Graphics2D) g;
- Graphics2D g3 = (Graphics2D) g;
- int scorex = 0;
- int fenx = 0;
- if(score == 100) {
- scorex = 700;
- fenx = 890;
- } else {
- scorex = 750;
- fenx = 860;
- }
- Font rewardFirstFont = new Font("DejaVuLGCSansMono", Font.BOLD, 130);
- AffineTransform affineTransform = new AffineTransform();
- affineTransform.rotate(Math.toRadians(15), 0, 0);
- Font rotatedFont = rewardFirstFont.deriveFont(affineTransform);
- g2.setColor(Color.decode("#F50000"));
- g2.setFont(rotatedFont);
- g2.drawString(String.valueOf(score),scorex,50);
- Font rewardLastFont = new Font("DejaVuLGCSansMono", Font.CENTER_BASELINE, 80);
- AffineTransform affineTransform2 = new AffineTransform();
- affineTransform2.rotate(Math.toRadians(15), 0, 0);
- Font rotatedFont2 = rewardLastFont.deriveFont(affineTransform);
- g3.setFont(rotatedFont2);
- g3.setColor(Color.decode("#F50000"));
- g3.drawString("分",fenx,280);
- g.dispose();
- g2.dispose();
- g3.dispose();
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- ImageIO.write(bufferedImage, "jpg", os);
- //保存为图片文件
- FileUtils.writeByteArrayToFile(new File(TESTQRCODE+"/dc/"+openid+".jpg"), os.toByteArray());
- //10、关闭输入输出流
- fis.close();
- os.close();
- return HTTTESTQRCODE+"/"+openid+".jpg";
- }
- public String CreatePOP( String wv_phone) throws Exception {
- //宠物图片文件
- // File petImg = new File(iconPath);
- //二维码图片文件 1
- File qrCodeImg = new File (LOCALQRCODE+"/"+wv_phone+".png");
- //背景地址
- //为了方便演示放在resources中,可根据实际情况(上传后)将背景模板放入单独的资源文件夹或远程资源服务器
- File fileBg = new File(DEMOQRCODE+"/demo.jpg");
- //1、背景图片输入流
- FileInputStream fis = new FileInputStream(fileBg);
- //2、背景图片对象
- Image srcImg = ImageIO.read(fis);
- //3、创建画布,根据背景图片的宽高
- BufferedImage bufferedImage = new BufferedImage(
- //宽度
- srcImg.getWidth(null),
- //高度
- srcImg.getHeight(null),
- //图片类型
- BufferedImage.TYPE_INT_RGB);
- int width = bufferedImage.getWidth();
- int height = bufferedImage.getHeight();
- //4、得到2d画笔对象
- Graphics2D g = bufferedImage.createGraphics();
- // 设置对线段的锯齿状边缘处理
- g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
- //5、设置画布背景
- g.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
- //6、```````````开始作画```````````
- // Font rewardFirstFont = new Font("PingFang SC Bold", Font.PLAIN, 24);
- // Font rewardLastFont = new Font("PingFang SC Bold", Font.PLAIN, 48);
- // int rewardFirstWidth = getStringWidth(g, rewardFirstFont, "赏金¥");
- // int rewardLastWidth = getStringWidth(g, rewardLastFont, "100");
- //赏金内容
- // drawString(g, Color.decode("#ffd434"), rewardFirstFont, "赏金¥", (width - rewardFirstWidth - rewardLastWidth) / 2, 550);
- // drawString(g, Color.decode("#ffd434"), rewardLastFont, "100", (width - rewardLastWidth + rewardFirstWidth) / 2, 550);
- // //标题
- // drawString(g, Color.decode("#323232"), new Font("PingFang SC Bold", Font.BOLD, 34), title, 0, 400, width, 12, 5, true);
- // //把宠物图片和二维码图片划入背景
- // g.drawImage(ImageIO.read(petImg), 130, 90, 362, 250, null);
- g.drawImage(ImageIO.read(qrCodeImg), 430, height-278, 220, 220, null);
- // ```````````结束作画```````````
- //7、处理画作
- g.dispose();
- //8、得到输出流
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- ImageIO.write(bufferedImage, "jpg", os);
- //9、转成base64编码前端可以直接显示,也可转换成其它形式比如文件
- // String encodeStr = Base64.getEncoder().encodeToString(os.toByteArray());
- //保存为图片文件
- FileUtils.writeByteArrayToFile(new File(DEMOQRCODE+"/"+wv_phone+".jpg"), os.toByteArray());
- //10、关闭输入输出流
- fis.close();
- os.close();
- // qrCodeImg.delete();
- // petImg.delete();
- return HTTPOPPQRCODE+"/"+wv_phone+".jpg";
- }
- public static void drawString(Graphics2D g, Color color, Font font, String content, float x, float y) {
- g.setColor(color);
- g.setFont(font);
- // g.rotate(30f);//倾斜?
- g.drawString(content, x, y);
- }
- public static void drawString(Graphics2D g, Color color, Font font, String content, float x, float y, int width, int lineWordNum, int linePadding, boolean center) {
- int num = content.length();
- java.util.List<String> contents = new ArrayList<>();
- if (num <= lineWordNum) {
- contents.add(content);
- } else {
- for (int i = 0; i < num; i += lineWordNum) {
- contents.add(StringUtils.substring(content, i, i + lineWordNum));
- }
- }
- for (int i = 0; i < contents.size(); i++) {
- String s = contents.get(i);
- if (i != 0) {
- y += linePadding + font.getSize();
- }
- if (center) {
- drawCenterString(g, color, font, s, width, y);
- } else {
- drawString(g, color, font, s, x, y);
- }
- }
- }
- public static void drawCenterString(Graphics2D g, Color color, Font font, String content, float y, int width, int lineWordNum, int linePadding) {
- drawString(g, color, font, content, 0, y, width, lineWordNum, linePadding, true);
- }
- public static void drawCenterString(Graphics2D g, Color color, Font font, String content, int width, float y) {
- int textWidth = getStringWidth(g, font, content);
- drawString(g, color, font, content, (width - textWidth) / 2, y);
- }
- public static int getStringWidth(Graphics2D g, Font font, String content) {
- FontMetrics fm = g.getFontMetrics(font);
- //获取字符串宽度
- return fm.stringWidth(content);
- }
- }
|