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