Java获取微信头像和昵称生成图片

author
1 minute, 18 seconds Read

申请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;
	}

 

Similar Posts