Explorar o código

二维码加头像

xiongzhu %!s(int64=5) %!d(string=hai) anos
pai
achega
580c7e8e50

+ 20 - 0
src/main/java/com/izouma/jiashanxia/service/UserService.java

@@ -46,10 +46,12 @@ import org.springframework.stereotype.Service;
 import javax.imageio.ImageIO;
 import javax.persistence.criteria.Predicate;
 import java.awt.*;
+import java.awt.geom.Ellipse2D;
 import java.awt.image.BufferedImage;
 import java.io.*;
 import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
+import java.net.URL;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.List;
@@ -478,6 +480,7 @@ public class UserService {
     }
 
     public String createShareImg(Long userId) throws IOException, WxErrorException {
+        User user = userRepo.findById(userId).orElseThrow(new BusinessException("用户不存在"));
         BufferedImage shareImg = ImageIO.read(this.getClass().getResourceAsStream("/static/shareImg.png"));
         BufferedImage result = new BufferedImage(shareImg.getWidth(), shareImg.getHeight(), BufferedImage.TYPE_INT_RGB);
         Graphics2D g = result.createGraphics();
@@ -494,6 +497,23 @@ public class UserService {
 
         g.drawImage(codeImg, 251 * 2, 543 * 2, 94 * 2, 94 * 2, null);
 
+        BufferedImage avatar = ImageIO
+                .read(new URL(Optional.ofNullable(user.getAvatar()).orElse(Constants.DEFAULT_AVATAR)));
+        int size = Math.min(avatar.getWidth(), avatar.getHeight());
+        BufferedImage subImg = avatar
+                .getSubimage((avatar.getWidth() - size) / 2, (avatar.getHeight() - size) / 2, size, size);
+        BufferedImage avatarImg = new BufferedImage(44 * 2, 44 * 2, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g2 = avatarImg.createGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+        g2.setComposite(AlphaComposite.SrcOver);
+        g2.setBackground(Color.GREEN);
+        g2.setClip(new Ellipse2D.Float(0, 0, 44 * 2, 44 * 2));
+        g2.drawImage(subImg, 0, 0, 44 * 2, 44 * 2, null);
+
+        g.drawImage(avatarImg, 276 * 2, 568 * 2, 44 * 2, 44 * 2, null);
+
         ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
         Thumbnails.of(result)
                 .scale(1)

+ 62 - 0
src/test/java/com/izouma/jiashanxia/CommonTest.java

@@ -1,8 +1,14 @@
 package com.izouma.jiashanxia;
 
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
 import com.izouma.jiashanxia.domain.BaseEntity;
 import com.izouma.jiashanxia.domain.User;
 import com.izouma.jiashanxia.web.BaseController;
+import me.chanjar.weixin.common.error.WxErrorException;
+import net.coobird.thumbnailator.Thumbnails;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.commons.text.CaseUtils;
 import org.bytedeco.javacv.FFmpegFrameGrabber;
@@ -22,11 +28,14 @@ import javax.imageio.ImageIO;
 import java.awt.*;
 import java.awt.font.FontRenderContext;
 import java.awt.geom.AffineTransform;
+import java.awt.geom.Ellipse2D;
 import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Method;
+import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Paths;
@@ -158,4 +167,57 @@ public class CommonTest {
         ByteArrayOutputStream baos1 = new ByteArrayOutputStream();
         ImageIO.write(image, "jpeg", new File("/Users/drew/Desktop/1.jpg"));
     }
+
+    @Test
+    public void shareImg() throws IOException, WxErrorException {
+        BufferedImage shareImg = ImageIO
+                .read(new File("/Users/drew/Projects/Java/jiashanxia/src/main/resources/static/shareImg.png"));
+        BufferedImage result = new BufferedImage(shareImg.getWidth(), shareImg.getHeight(), BufferedImage.TYPE_INT_RGB);
+        Graphics2D g = result.createGraphics();
+        g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+        g.setComposite(AlphaComposite.SrcOver);
+        g.drawImage(shareImg, 0, 0, null);
+
+        WxMaService wxMaService = new WxMaServiceImpl();
+        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
+        config.setAppid("wx29e886237ed709b2");
+        config.setSecret("257c23ed1e257f260ab13ce6400ebf4f");
+        config.setToken("msgToken");
+        config.setAesKey("key");
+        config.setMsgDataFormat("JSON");
+        wxMaService.setWxMaConfig(config);
+
+        byte[] bytes = wxMaService.getQrcodeService()
+                .createWxaCodeUnlimitBytes("expert=true&invitor=123", "pages/home", 94 * 2, false, new WxMaCodeLineColor("0", "0", "0"), true);
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
+        BufferedImage codeImg = ImageIO.read(byteArrayInputStream);
+
+        g.drawImage(codeImg, 251 * 2, 543 * 2, 94 * 2, 94 * 2, null);
+
+
+        BufferedImage avatar = ImageIO
+                .read(new URL("https://wx1.sinaimg.cn/mw690/006qrratgy1gnbbtuqiblj32802you0y.jpg"));
+        int size = Math.min(avatar.getWidth(), avatar.getHeight());
+        BufferedImage subImg = avatar
+                .getSubimage((avatar.getWidth() - size) / 2, (avatar.getHeight() - size) / 2, size, size);
+        BufferedImage avatarImg = new BufferedImage(44 * 2, 44 * 2, BufferedImage.TYPE_INT_ARGB);
+        Graphics2D g2 = avatarImg.createGraphics();
+        g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+        g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
+        g2.setComposite(AlphaComposite.SrcOver);
+        g2.setBackground(Color.GREEN);
+        g2.setClip(new Ellipse2D.Float(0, 0, 44 * 2, 44 * 2));
+        g2.drawImage(subImg, 0, 0, 44 * 2, 44 * 2, null);
+
+        g.drawImage(avatarImg, 276 * 2, 568 * 2, 44 * 2, 44 * 2, null);
+
+        Thumbnails.of(result)
+                .scale(1)
+                .outputQuality(.9f)
+                .outputFormat("jpg")
+                .toFile("/Users/drew/Desktop/share.jpg");
+    }
 }

+ 1 - 1
src/test/java/com/izouma/jiashanxia/service/UserServiceTest.java

@@ -75,7 +75,7 @@ public class UserServiceTest {
 
     @Test
     public void shareImg() throws IOException, WxErrorException {
-        System.out.println(userService.createShareImg(1L));
+        System.out.println(userService.createShareImg(908L));
 
     }