生成小程序的二维码的base64码(中间logo可以自定义)

1.生成基础二维码

java 复制代码
    /**
     * 生成微信小程序二维码,带参数,最终转成base64
     * @param page 当前小程序相对页面 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
     * @param scene 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
     * @param accessToken 接口调用凭证
     */
    public static String generateQrCode(String page, String scene,String accessToken) {
            BufferedImage bi= null;
        try {
            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            JSONObject paramJson = new JSONObject();
            paramJson.put("scene", scene);
            paramJson.put("page", page);
            paramJson.put("width", 430);
            paramJson.put("auto_color", false);
            JSONObject lineColor = new JSONObject();
            lineColor.put("r", 0);
            lineColor.put("g", 0);
            lineColor.put("b", 0);
            paramJson.put("line_color", lineColor);
            printWriter.write(paramJson.toString());
            printWriter.flush();
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            bi = ImageIO.read(bis);
            printWriter.close();
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            try {
                // 设置图片格式
                ImageIO.write(bi, "jpg", stream);
            } catch (IOException e) {
                e.printStackTrace();
            }


            byte[] bytes = Base64.encodeBase64(stream.toByteArray());
            String base64 = new String(bytes);
            return "data:image/jpeg;base64," + base64;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

加入以下代码:

java 复制代码
            //要替换的图片路径
            BufferedImage logoImage = ImageIO.read(new URL("https://nk-mall.oss-cn-shenzhen.aliyuncs.com/WDMPV_MP/1698932836550.png"));
            // logo图的宽高
            int width = logoImage.getWidth();
            int height = logoImage.getHeight();
            // 保存正方形的边长
            int size = Math.min(width, height);
            // 判断那条边的边更长
            // 裁剪:获取正中间的正方形,边长为图片宽的值 后面.size方法必须调用 否则异常
            logoImage = Thumbnails.of(logoImage).sourceRegion(Positions.CENTER, size, size).size(size, size).asBufferedImage();
            // 转成圆形
            logoImage = convertCircular(logoImage);
            // 缩放:放大微信二维码的底图  目的为了减少对用户上传的图片缩放过小图片失真
            bi = Thumbnails.of(bi).size(bi.getHeight() * 2, bi.getHeight() * 2).asBufferedImage();
            // 使用Graphics2D合并图片
            Graphics2D g2 = null;
            // 读取微信二维码图片
            g2 = bi.createGraphics();
            // 合并:并设置偏移量,logo图片大小。具体需要自己按照实际的大小调整
            g2.drawImage(logoImage, 232 , 232, 395, 395, null);
            g2.dispose();

完整代码:

java 复制代码
​
/**
     * 生成微信小程序二维码,带参数,最终转成base64
     * @param page 当前小程序相对页面 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
     * @param scene 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
     * @param accessToken 接口调用凭证
     */
    public static String generateQrCode(String page, String scene,String accessToken) {
            BufferedImage bi= null;
        try {
            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
            HttpURLConnection httpURLConnection = (HttpURLConnection)url.openConnection();
            httpURLConnection.setRequestMethod("POST");
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());
            JSONObject paramJson = new JSONObject();
            paramJson.put("scene", scene);
            paramJson.put("page", page);
            paramJson.put("width", 430);
            paramJson.put("auto_color", false);
            JSONObject lineColor = new JSONObject();
            lineColor.put("r", 0);
            lineColor.put("g", 0);
            lineColor.put("b", 0);
            paramJson.put("line_color", lineColor);
            printWriter.write(paramJson.toString());
            printWriter.flush();
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            bi = ImageIO.read(bis);
            printWriter.close();

            //要替换的图片路径
            BufferedImage logoImage = ImageIO.read(new URL("https://nk-mall.oss-cn-shenzhen.aliyuncs.com/WDMPV_MP/1698932836550.png"));
            // logo图的宽高
            int width = logoImage.getWidth();
            int height = logoImage.getHeight();
            // 保存正方形的边长
            int size = Math.min(width, height);
            // 判断那条边的边更长
            // 裁剪:获取正中间的正方形,边长为图片宽的值 后面.size方法必须调用 否则异常
            logoImage = Thumbnails.of(logoImage).sourceRegion(Positions.CENTER, size, size).size(size, size).asBufferedImage();
            // 转成圆形
            logoImage = convertCircular(logoImage);
            // 缩放:放大微信二维码的底图  目的为了减少对用户上传的图片缩放过小图片失真
            bi = Thumbnails.of(bi).size(bi.getHeight() * 2, bi.getHeight() * 2).asBufferedImage();
            // 使用Graphics2D合并图片
            Graphics2D g2 = null;
            // 读取微信二维码图片
            g2 = bi.createGraphics();
            // 合并:并设置偏移量,logo图片大小。具体需要自己按照实际的大小调整
            g2.drawImage(logoImage, 232 , 232, 395, 395, null);
            g2.dispose();


            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            try {
                // 设置图片格式
                ImageIO.write(bi, "jpg", stream);
            } catch (IOException e) {
                e.printStackTrace();
            }


            byte[] bytes = Base64.encodeBase64(stream.toByteArray());
            String base64 = new String(bytes);
            return "data:image/jpeg;base64," + base64;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

​
相关推荐
!win !18 小时前
uni-app项目支付宝端Input不受控
小程序·uni-app·支付宝小程序
毕设源码-钟学长20 小时前
【开题答辩全过程】以 “旧书驿站”微信小程序的设计与开发为例,包含答辩的问题和答案
微信小程序·小程序
毕设源码-赖学姐2 天前
【开题答辩全过程】以 “饭否”食材搭配指南小程序的设计与实现为例,包含答辩的问题和答案
小程序
nodcloud2 天前
点可云进销存商城如何部署在微信小程序
微信小程序·小程序
老华带你飞2 天前
畅阅读小程序|畅阅读系统|基于java的畅阅读系统小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·小程序·毕设·畅阅读系统小程序
老华带你飞2 天前
租房平台|租房管理平台小程序系统|基于java的租房系统 设计与实现(源码+数据库+文档)
java·数据库·小程序·vue·论文·毕设·租房系统管理平台
项目題供诗2 天前
微信小程序开发教程(八)
微信小程序·小程序
00后程序员张3 天前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
低代码布道师3 天前
少儿舞蹈小程序(12)作品列表查询搭建
低代码·小程序
编程迪3 天前
基于Java+Vue开发的家政服务系统源码适配H5小程序APP
小程序·家政小程序·家政系统源码·家政系统·家政源码