申请CSDN账号已经很久了,一直在论坛上浏览别人的东西。 我从来没有写过任何严肃的事情。 我渐渐忘记了很多我见过的、用过的东西。 我会在忘记之前总结一下,以便以后参考。 话不多说,让我们开始实际操作吧。

该需求来自公司目前正在进行的一次营销活动,需要生成带有用户二维码、头像、昵称等简答信息的营销海报。 我只使用java生成图片,大致思路是以下步骤。

1.获取用户的昵称和头像。

2. 生成二维码。

3、设置背景图片,将用户信息放在背景图片上。

1.获取用户的昵称和头像。

无论是微信用户信息,还是获取、生成二维码所需的数据,都需要调用微信接口。 如果您对微信开发不熟悉,请查看开发文档:微信公众平台-腾讯

要获取微信上的用户信息,需要先从微信中获取code,根据code查询openid,得到openid的唯一值。 然后查询用户信息。

2. 生成二维码。

二维码生成的链接需要长链接

二维码生成的链接需要长链接

二维码生成的链接需要长链接

重要的是说3遍,如果不分享长连接生成的二维码就会出现问题。

网上也有很多获取用户信息并生成二维码的例子。 也很详细,这里不再赘述:微信公众平台开发(76)获取用户基本信息

3、设置背景图片,将用户信息放在背景图片上。

剩下的就是用java把背景图和用户信息放在一起(头像需要剪成圆形),直接上传干货。

//获取用户信息具体方法我就不写了,上文链接写的比我详细    String nickname = "微信用户名称";String imageurl = "微信头像";//设置背景图片Image im = ImageIO.read(new java.net.URL("背景图片路径"));BufferedImage image = new BufferedImage(750,730+600, BufferedImage.TYPE_INT_RGB);//背景图片大小Graphics g = image.getGraphics();g.drawImage(im, 0, 0, null);Qrcode qrcode = new Qrcode();qrcode.setQrcodeErrorCorrect('M');qrcode.setQrcodeEncodeMode('B');qrcode.setQrcodeVersion(7);//生成二维码String qrData = "二维码长连接路径";int width = 300;int height = 300;BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);Graphics2D gs = bufferedImage.createGraphics();gs.setBackground(Color.WHITE);gs.setColor(Color.BLACK);gs.clearRect(0, 0, width, height);int pixoff = 15;byte[] d = qrData.getBytes("utf-8");if (d.length > 0 && d.length < 120) {boolean[][] s = qrcode.calQrcode(d);System.out.println(s.length);for (int i = 0; i < s.length; i++) {for (int j = 0; j < s.length; j++) {if (s[j][i]) {gs.fillRect(j * 6 + pixoff, i * 6 + pixoff, 6, 6);}}}}gs.dispose();bufferedImage.flush();g.drawImage(bufferedImage,280,720,200,200,null);//设置二维码位置Image weixinimage = ImageIO.read(new java.net.URL(imageurl));//设置头像 makeRoundedCorner()方法是将头像切成圆形g.drawImage(makeRoundedCorner((BufferedImage)weixinimage,720),290,1020,180,180,null);//设置头像位置//设置文字Font f = new Font("宋体",Font.PLAIN,35);      g.setColor(Color.white);      g.setFont(f);     //设置文字居中FontMetrics fm = g.getFontMetrics();int nameWidth = fm.stringWidth(nickname);g.drawString(nickname, (750-nameWidth)/2, 1250);//设置字体位置ImageIO.write(image, "png", response.getOutputStream());

生成原型图片代码,参考文章:透明背景切割圆形图(正方形图和圆形图)的java代码

public static BufferedImage makeRoundedCorner(BufferedImage image, int cornerRadius) {int w = image.getWidth();int h = image.getHeight();BufferedImage output = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);Graphics2D g2 = output.createGraphics();g2.setComposite(AlphaComposite.Src);g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2.setColor(Color.WHITE);g2.fill(new RoundRectangle2D.Float(0, 0, w, h, cornerRadius, cornerRadius));g2.setComposite(AlphaComposite.SrcAtop);g2.drawImage(image, 0, 0, null);g2.dispose();return output;}

作者 admin