小程序生成商品分享二维码海报解决方案和实现方式JAVA
阅读原文时间:2023年07月09日阅读:3

使用技术:  Graphics , 七牛云 , 微信sdk(github上非常出名的wxjava,地址https://github.com/Wechat-Group/WxJava/)
直接上干货代码,每一步都有详细注释, TODO 的地址修改为自己的信息,一个合格的程序员懂得灵活运用代码. 如果想实现画入文字并且更具 \n 自动换行,可根据代码自行优化(已经实现自动换行).

@Test
public void share() throws Exception {
//创建图片
BufferedImage img = new BufferedImage(750, 1334, BufferedImage.TYPE_INT_RGB);
//开启画图
Graphics g = img.getGraphics();
//背景 -- 读取互联网图片
BufferedImage back = ImageIO.read(new URL("填写海报的背景图片链接"));
g.drawImage(back.getScaledInstance(750, 1334, Image.SCALE_DEFAULT), 0, 0, null); // 绘制缩小后的图
//商品 banner图
//读取互联网图片
BufferedImage priductUrl = ImageIO.read(new URL("填写自己的banner图,线上链接")); //TODO
g.drawImage(priductUrl.getScaledInstance(690,516,Image.SCALE_DEFAULT),29,61,null);
//文案标题
g.setFont(new Font("微软雅黑", Font.BOLD, 34));
g.setColor(new Color(29,29,29));
//绘制文字
g.drawString("填写文案标题", 31, 638);//TODO
//文案
g.setFont(new Font("微软雅黑", Font.PLAIN, 30));
g.setColor(new Color(47,47,47));
int fontlen = getWatermarkLength("填写文内容", g);//TODO
//文字长度相对于图片宽度应该有多少行
int line = fontlen / (back.getWidth() - 90);
//高度
int y = back.getHeight() - (line + 1) * 30 - 500;
//文字叠加,自动换行叠加
int tempX = 32;
int tempY = y;
//单字符长度
int tempCharLen = 0;
//单行字符总长度临时计算
int tempLineLen = 0;
StringBuffer sb =new StringBuffer();
for(int i=0; i < "填写文内容".length(); i++) {//TODO char tempChar = "填写文内容".charAt(i);//TODO tempCharLen = getCharLen(tempChar, g); tempLineLen += tempCharLen; if(tempLineLen >= (back.getWidth()-90)) {
//长度已经满一行,进行文字叠加
g.drawString(sb.toString(), tempX, tempY + 50);
//清空内容,重新追加
sb.delete(0, sb.length());
//每行文字间距50
tempY += 50;
tempLineLen =0;
}
//追加字符
sb.append(tempChar);
}
//最后叠加余下的文字
g.drawString(sb.toString(), tempX, tempY + 50);

    //价格背景  
    //读取互联网图片  
    BufferedImage bground  = ImageIO.read(new URL("填写自己的价格背景图,七牛图片链接"));//TODO  
    // 绘制缩小后的图  
    g.drawImage(bground.getScaledInstance(160, 40, Image.SCALE\_DEFAULT), 30, 1053, null);

    //限时促销价  
    g.setFont(new Font("微软雅黑", Font.PLAIN, 24));  
    g.setColor(new Color(255,255,255));  
    g.drawString("限时促销价", 50, 1080);

    //价格  
    g.setFont(new Font("微软雅黑", Font.PLAIN, 50));  
    g.setColor(new Color(249,64,64));  
    g.drawString("¥" + "填写商品的价格", 29, 1162);//TODO

    //原价  
    g.setFont(new Font("微软雅黑", Font.PLAIN, 36));  
    g.setColor(new Color(171,171,171));  
    String price = "¥" + "填写商品的原价";//TODO  
    g.drawString(price, 260, 1160);  
    g.drawLine(250,1148,260+150,1148);

    //商品名称  
    g.setFont(new Font("微软雅黑", Font.PLAIN, 32));  
    g.setColor(new Color(29,29,29));  
    g.drawString("填写商品名称", 30, 1229);//TODO

    //生成二维码返回链接  
    String url = "";//TODO  
    //读取互联网图片  
    BufferedImage qrCode  = ImageIO.read(new URL(url));  
    // 绘制缩小后的图  
    g.drawImage(qrCode.getScaledInstance(174, 174, Image.SCALE\_DEFAULT), 536, 1057, null);

    //二维码字体  
    g.setFont(new Font("微软雅黑", Font.PLAIN, 25));  
    g.setColor(new Color(171,171,171));  
    //绘制文字  
    g.drawString("扫描或长按小程序码", 515, 1260);

    g.dispose();  
    //保存到本地 生成文件名字  
    String iconKey = UUID.randomUUID().toString() +".png"; //TODO  
    //先将画好的海报写到本地  
    String picUrl = "填写自己电脑的路径" + iconKey; // TODO  
    File file = new File(picUrl);  
    ImageIO.write(img, "jpg",file);  
    //再将file上传至七牛返回链接存入数据库  
    //end  
    // TODO  
    }

/\*\*  
 \* 获取水印文字总长度  
 \*@paramwaterMarkContent水印的文字  
 \*@paramg  
 \*@return水印文字总长度  
 \*/  
public int getWatermarkLength(String waterMarkContent, Graphics g) {  
    return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(),0, waterMarkContent.length());  
}  
public int getCharLen(char c, Graphics g) {  
    return g.getFontMetrics(g.getFont()).charWidth(c);  
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器