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 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 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); } }