CreatePOPService.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package com.ygj.yuemum.service.global;
  2. import com.ygj.yuemum.component.Constant;
  3. import org.apache.commons.io.FileUtils;
  4. import org.apache.commons.lang.StringUtils;
  5. import org.springframework.stereotype.Service;
  6. import javax.imageio.ImageIO;
  7. import javax.imageio.ImageReadParam;
  8. import javax.imageio.ImageReader;
  9. import javax.imageio.stream.ImageInputStream;
  10. import javax.swing.*;
  11. import java.awt.*;
  12. import java.awt.geom.AffineTransform;
  13. import java.awt.image.BufferedImage;
  14. import java.io.*;
  15. import java.util.ArrayList;
  16. import java.util.Iterator;
  17. @Service
  18. public class CreatePOPService {
  19. public static final String LOCALQRCODE = Constant.LOCALQRCODE;
  20. public static final String DEMOQRCODE = Constant.DEMOQRCODE;
  21. public static final String HTTPOPPQRCODE = Constant.HTTPOPPQRCODE;
  22. public static final String HTTTESTQRCODE = Constant.HTTTESTQRCODE;
  23. public static final String TESTQRCODE = Constant.TESTQRCODE;
  24. public String CreateTestShare(String qrcode,String testImg,Integer score,String openid) throws IOException {
  25. File qrCodeImg = new File(LOCALQRCODE+"/"+qrcode);
  26. File fileBg = new File(TESTQRCODE+"/"+testImg);
  27. FileInputStream fis = new FileInputStream(fileBg);
  28. ImageIcon imageIcon = new ImageIcon(TESTQRCODE+"/"+testImg);
  29. int iconWidth = imageIcon.getIconWidth();
  30. int iconHeight = imageIcon.getIconHeight() -200;
  31. ImageInputStream iis = ImageIO.createImageInputStream(fileBg);
  32. Iterator<ImageReader> it = ImageIO.getImageReaders(iis);
  33. ImageReader r = it.next();
  34. r.setInput(iis, true);
  35. ImageReadParam param = r.getDefaultReadParam();
  36. Rectangle rect = new Rectangle(0, 0, iconWidth, iconHeight);
  37. param.setSourceRegion(rect);
  38. BufferedImage bufferedImage = r.read(0, param);
  39. Graphics2D g = bufferedImage.createGraphics();
  40. g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  41. g.drawImage(bufferedImage.getScaledInstance(iconWidth, iconHeight, Image.SCALE_SMOOTH), 0, 0, null);
  42. g.drawImage(ImageIO.read(qrCodeImg), 100, iconHeight-300, 200, 200, null);
  43. Graphics2D g2 = (Graphics2D) g;
  44. Graphics2D g3 = (Graphics2D) g;
  45. int scorex = 0;
  46. int fenx = 0;
  47. if(score == 100) {
  48. scorex = 700;
  49. fenx = 890;
  50. } else {
  51. scorex = 750;
  52. fenx = 860;
  53. }
  54. Font rewardFirstFont = new Font("DejaVuLGCSansMono", Font.BOLD, 130);
  55. AffineTransform affineTransform = new AffineTransform();
  56. affineTransform.rotate(Math.toRadians(15), 0, 0);
  57. Font rotatedFont = rewardFirstFont.deriveFont(affineTransform);
  58. g2.setColor(Color.decode("#F50000"));
  59. g2.setFont(rotatedFont);
  60. g2.drawString(String.valueOf(score),scorex,50);
  61. Font rewardLastFont = new Font("DejaVuLGCSansMono", Font.CENTER_BASELINE, 80);
  62. AffineTransform affineTransform2 = new AffineTransform();
  63. affineTransform2.rotate(Math.toRadians(15), 0, 0);
  64. Font rotatedFont2 = rewardLastFont.deriveFont(affineTransform);
  65. g3.setFont(rotatedFont2);
  66. g3.setColor(Color.decode("#F50000"));
  67. g3.drawString("分",fenx,280);
  68. g.dispose();
  69. g2.dispose();
  70. g3.dispose();
  71. ByteArrayOutputStream os = new ByteArrayOutputStream();
  72. ImageIO.write(bufferedImage, "jpg", os);
  73. //保存为图片文件
  74. FileUtils.writeByteArrayToFile(new File(TESTQRCODE+"/dc/"+openid+".jpg"), os.toByteArray());
  75. //10、关闭输入输出流
  76. fis.close();
  77. os.close();
  78. return HTTTESTQRCODE+"/"+openid+".jpg";
  79. }
  80. public String CreatePOP( String wv_phone) throws Exception {
  81. //宠物图片文件
  82. // File petImg = new File(iconPath);
  83. //二维码图片文件 1
  84. File qrCodeImg = new File (LOCALQRCODE+"/"+wv_phone+".png");
  85. //背景地址
  86. //为了方便演示放在resources中,可根据实际情况(上传后)将背景模板放入单独的资源文件夹或远程资源服务器
  87. File fileBg = new File(DEMOQRCODE+"/demo.jpg");
  88. //1、背景图片输入流
  89. FileInputStream fis = new FileInputStream(fileBg);
  90. //2、背景图片对象
  91. Image srcImg = ImageIO.read(fis);
  92. //3、创建画布,根据背景图片的宽高
  93. BufferedImage bufferedImage = new BufferedImage(
  94. //宽度
  95. srcImg.getWidth(null),
  96. //高度
  97. srcImg.getHeight(null),
  98. //图片类型
  99. BufferedImage.TYPE_INT_RGB);
  100. int width = bufferedImage.getWidth();
  101. int height = bufferedImage.getHeight();
  102. //4、得到2d画笔对象
  103. Graphics2D g = bufferedImage.createGraphics();
  104. // 设置对线段的锯齿状边缘处理
  105. g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
  106. //5、设置画布背景
  107. g.drawImage(srcImg.getScaledInstance(width, height, Image.SCALE_SMOOTH), 0, 0, null);
  108. //6、```````````开始作画```````````
  109. // Font rewardFirstFont = new Font("PingFang SC Bold", Font.PLAIN, 24);
  110. // Font rewardLastFont = new Font("PingFang SC Bold", Font.PLAIN, 48);
  111. // int rewardFirstWidth = getStringWidth(g, rewardFirstFont, "赏金¥");
  112. // int rewardLastWidth = getStringWidth(g, rewardLastFont, "100");
  113. //赏金内容
  114. // drawString(g, Color.decode("#ffd434"), rewardFirstFont, "赏金¥", (width - rewardFirstWidth - rewardLastWidth) / 2, 550);
  115. // drawString(g, Color.decode("#ffd434"), rewardLastFont, "100", (width - rewardLastWidth + rewardFirstWidth) / 2, 550);
  116. // //标题
  117. // drawString(g, Color.decode("#323232"), new Font("PingFang SC Bold", Font.BOLD, 34), title, 0, 400, width, 12, 5, true);
  118. // //把宠物图片和二维码图片划入背景
  119. // g.drawImage(ImageIO.read(petImg), 130, 90, 362, 250, null);
  120. g.drawImage(ImageIO.read(qrCodeImg), 430, height-278, 220, 220, null);
  121. // ```````````结束作画```````````
  122. //7、处理画作
  123. g.dispose();
  124. //8、得到输出流
  125. ByteArrayOutputStream os = new ByteArrayOutputStream();
  126. ImageIO.write(bufferedImage, "jpg", os);
  127. //9、转成base64编码前端可以直接显示,也可转换成其它形式比如文件
  128. // String encodeStr = Base64.getEncoder().encodeToString(os.toByteArray());
  129. //保存为图片文件
  130. FileUtils.writeByteArrayToFile(new File(DEMOQRCODE+"/"+wv_phone+".jpg"), os.toByteArray());
  131. //10、关闭输入输出流
  132. fis.close();
  133. os.close();
  134. // qrCodeImg.delete();
  135. // petImg.delete();
  136. return HTTPOPPQRCODE+"/"+wv_phone+".jpg";
  137. }
  138. public static void drawString(Graphics2D g, Color color, Font font, String content, float x, float y) {
  139. g.setColor(color);
  140. g.setFont(font);
  141. // g.rotate(30f);//倾斜?
  142. g.drawString(content, x, y);
  143. }
  144. public static void drawString(Graphics2D g, Color color, Font font, String content, float x, float y, int width, int lineWordNum, int linePadding, boolean center) {
  145. int num = content.length();
  146. java.util.List<String> contents = new ArrayList<>();
  147. if (num <= lineWordNum) {
  148. contents.add(content);
  149. } else {
  150. for (int i = 0; i < num; i += lineWordNum) {
  151. contents.add(StringUtils.substring(content, i, i + lineWordNum));
  152. }
  153. }
  154. for (int i = 0; i < contents.size(); i++) {
  155. String s = contents.get(i);
  156. if (i != 0) {
  157. y += linePadding + font.getSize();
  158. }
  159. if (center) {
  160. drawCenterString(g, color, font, s, width, y);
  161. } else {
  162. drawString(g, color, font, s, x, y);
  163. }
  164. }
  165. }
  166. public static void drawCenterString(Graphics2D g, Color color, Font font, String content, float y, int width, int lineWordNum, int linePadding) {
  167. drawString(g, color, font, content, 0, y, width, lineWordNum, linePadding, true);
  168. }
  169. public static void drawCenterString(Graphics2D g, Color color, Font font, String content, int width, float y) {
  170. int textWidth = getStringWidth(g, font, content);
  171. drawString(g, color, font, content, (width - textWidth) / 2, y);
  172. }
  173. public static int getStringWidth(Graphics2D g, Font font, String content) {
  174. FontMetrics fm = g.getFontMetrics(font);
  175. //获取字符串宽度
  176. return fm.stringWidth(content);
  177. }
  178. }