zoukankan      html  css  js  c++  java
  • 小程序生成商品分享二维码海报解决方案和实现方式JAVA

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

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

  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/tomingto/p/12177002.html
Copyright © 2011-2022 走看看