java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上

简介: 这篇文章介绍了如何使用Java获取微信小程序的二维码,并将其调整大小后合成到海报(另一张图片)上。

前言

  1. 文字换行算法详解,传送门:java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
  2. 头像切割成圆形方法详解,传送门:java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
  3. 获取微信二维码详情,传送门:java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
  4. java BufferedImage 转 InputStreampng 图片合成到模板(另一个图片)上时,透明部分变成了黑色,传送门:java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
  5. java 整合echarts 画出 折线图,传送门:
  6. Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题,传送门:java制作海报六:Graphics2D的RenderingHints方法参数详解,包括解决文字不清晰,抗锯齿问题
  7. 项目部署到linux下中文不显示,echarts图上的中文也不显示问题,传送门:java制作海报七:java Graphics2D 合成图片 在 linux下中文不显示,echarts图上的中文也不显示问题
  • 本次博客主要是 稍微说一下获取微信二维码详情,这里的代码都在 Main_CreatePosterAndEchart.java

一、描述

这里需要获取微信小程序二维码,放到海报的左下角,其实获取二维码的过程,看微信开发文档即可。

微信开发文档-获取微信二维码

二、逻辑代码

// 画 二维码 并改变大小
// 1. 先 获取二维码(二维码携带一个参数)
InputStream erWeiMa = getErWeiMa(1);
// 2. 初始化并的改变大小
BufferedImage logoImg = PosterUtil.drawInitAndChangeSize(null, erWeiMa, 130, 130);
// 将二维码保存到本地
PosterUtil.save(logoImg, "png", "d:\\test.png");
// 3. 画二维码
PosterUtil.drawImage(bufferedImage, logoImg, 532, 1108);

三、获取二维码代码

id 是放到二维码里的参数。返回 输入流。

    /**
     * @return java.io.InputStream
     * @Author fengfanli
     * @Description //TODO 从微信平台 获取小程序二维码
     * @Date 16:53 2021/4/1
     * @Param []
     **/
    public static InputStream getErWeiMa(Integer id) {
        // 获取二维码:1、先获取access_token 2、在获取 二维码
        String appId = PropertiesFileUtil.getInstance("app").get("wx.app.ip");
        String appSecret = PropertiesFileUtil.getInstance("app").get("wx.app.secret");
        System.out.println("appId==" + appId + ";appSecret==" + appSecret);
        // 获取 access_token
        String getUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appId + "&secret=" + appSecret;
        System.out.println("getUrl==" + getUrl);
        String str = HttpUtil.sendGet(getUrl);
        JSONObject json = (JSONObject) JSONObject.parse(str);
        String access_token = (String) json.get("access_token");
        System.out.println("access_token:" + access_token);
        // 获取 二维码图片流
        String postURL = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + access_token;
        System.out.println("postURL==" + postURL);
        JSONObject jsonObject = new JSONObject();
        // 这里往二维码里放入前端传过来的 id,前端获取之后,根据id 去获取详情
        jsonObject.put("scene", id);
        String scene = JSONObject.toJSONString(jsonObject);
        InputStream inputStream = null;
        inputStream = HttpUtil.sendPostForErWeiMa(postURL, scene);
        return inputStream;
    }

四、将二维码画(合成)到模板上

1. 描述

这个方法在PosterUtil上
先初始化,在改变大小,

2. 初始化代码和改变大小 代码

    /**
     * @return java.awt.image.BufferedImage
     * @Author fengfanli
     * @Description //TODO 初始化模板并改变宽度和高度
     * @Date 9:56 2021/3/30
     * @Param [path, width, height]
     **/
    public static BufferedImage drawInitAndChangeSize(String path, InputStream inputStream, int width, int height) throws Exception {
        BufferedImage canvas = null;
        if (path != null) {
            URL url = new URL(path);
            canvas = ImageIO.read(url);
        }
        if (inputStream != null) {
            canvas = ImageIO.read(inputStream);
        }
        canvas = changeSize(canvas, width, height);
        return canvas;
    }

    /**
     * @return java.awt.image.BufferedImage
     * @Author fengfanli
     * @Description // TODO 改变宽度和高度:先画一个空白的图,再将需要改变大小的图 画上去,再限制大小
     * @Date 9:56 2021/3/30
     * @Param [originalImage, width, height]
     **/
    public static BufferedImage changeSize(BufferedImage originalImage, int width, int height) {
        // 抗锯齿
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);  // originalImage.getType() 改为 BufferedImage.TYPE_INT_RGB
        Graphics2D g2d = image.createGraphics();
        image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.OPAQUE);
        g2d = image.createGraphics();
        g2d.drawImage(originalImage, 0, 0, width, height, null);
        g2d.dispose();
        return image;
    }

3. 合成图 代码

    /**
     * @return java.awt.image.BufferedImage
     * @Author fengfanli
     * @Description //TODO 在背景模板上放置 image
     * @Date 9:57 2021/3/30
     * @Param [canvas, logo, logoX, logoY]
     **/
    public static void drawImage(BufferedImage canvas, BufferedImage logo, int logoX, int logoY) {
        Graphics2D g2d = canvas.createGraphics();
        //g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1));
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.drawImage(logo, logoX, logoY, null);
        g2d.dispose();
    }
相关文章
|
24天前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
53 4
|
24天前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
49 2
|
11天前
|
小程序 前端开发 算法
|
16天前
|
Java API 开发者
Java如何实现企业微信审批流程
大家好,我是V哥。本文分享如何在企业微信中实现审批流程,通过调用企业微信的开放API完成。主要内容包括获取Access Token、创建审批模板、发起审批流程和查询审批结果。提供了一个Java示例代码,帮助开发者快速上手。希望对你有帮助,关注V哥爱编程,编码路上同行。
|
24天前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
30天前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
18 1
|
1月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
50 1
|
4天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
13天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
3天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####