Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 7795|回复: 0

小程序生成商品分享二维码海报解决方案和实现方式JAVA

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-4-8 11:43:36 | 显示全部楼层 |阅读模式

    使用技术:  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);
        }
     

     

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-16 16:48 , Processed in 0.074473 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表