这里写自定义目录标题

  • 前言
    • 生成图片最后效果(省略公司logo)
    • 代码
    • 开发中遇到的坑
      • 1.通过Postman能够获取出海报图片,但是前端获取是获取不到

前言

需求是生成二维码分享海报,作为学生加入班级的一个方式,本来想着用前端canvas来实现,生成想要的图片,可视化比较好。后来改为后端生成固定格式的海报图片,只是班级信息发生改变。就想着由前端传入响应的参数,后端根据参数使用Graphics2D 画一张海报,然后通过图片流的方式返回给前端。

生成图片最后效果(省略公司logo)

代码

ctroller层接口方法:

@RequestMapping(value = "/getClassQr")public void getClassQr(@RequestBody Map<String, String> request, HttpServletResponse response) {try {// 设置响应流信息response.setContentType("image/jpg");response.setHeader("Pragma", "no-cache");response.setHeader("Cache-Control", "no-cache");response.setDateHeader("Expires", 0);//海报的宽高int pic_width = 750;int pic_height = 1334;BufferedImage bufferedImage = new BufferedImage(pic_width, pic_height, BufferedImage.TYPE_INT_RGB);OutputStream stream = response.getOutputStream();bufferedImage = getClassQr(request, bufferedImage);//以流的形式输出到前端ImageIO.write(bufferedImage, "jpg", stream);} catch (IOException e) {e.printStackTrace();}}

核心方法:

    public BufferedImage getClassQr(Map<String, String> request, BufferedImage bufferedImage) {String className = request.get("className");String kdgtName = request.get("schoolName");String note = "扫码加入班级群";String url = request.get("url");BitMatrix bitMatrix = null;Graphics2D graphics2D = (Graphics2D) bufferedImage.getGraphics();graphics2D.setColor(Color.WHITE);graphics2D.fillRect(0, 0, 750, 1334);graphics2D.setColor(Color.BLACK);int classNameHeight = 238;try {Font font = new Font("微软雅黑", Font.BOLD, 48);graphics2D.setFont(font);graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);//1.填充院系名称FontDesignMetrics metrics = FontDesignMetrics.getMetrics(font);graphics2D = makeLineFeed(kdgtName, metrics, 150, 750, graphics2D);if (metrics.stringWidth(kdgtName) > 750) {classNameHeight = 150 + metrics.getHeight() * 2;}//2.填充班级名称font = new Font("微软雅黑", Font.PLAIN, 32);graphics2D.setFont(font);int height = metrics.getHeight();metrics = FontDesignMetrics.getMetrics(font);//超过图片则换行graphics2D = makeLineFeed(className, metrics, classNameHeight, 750, graphics2D);//3.填充二维码//其他参数,如字符集编码Map<EncodeHintType, Object> hints = new HashMap<>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");//容错级别为Hhints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);//白边的宽度,可取0~4hints.put(EncodeHintType.MARGIN, 0);//生成矩阵,参数URLbitMatrix = new MultiFormatWriter().encode(url, BarcodeFormat.QR_CODE, 600, 600, hints);graphics2D.drawImage(toBufferedImage(bitMatrix), 76, 364, 600, 600, null);//4.填充扫码加入班级群字font = new Font("微软雅黑", Font.PLAIN, 36);graphics2D.setFont(font);graphics2D.drawString(note, 252, 1024);//5.填充logo图片
//            ClassLoader classLoader = this.getClass().getClassLoader();
//            String path = classLoader.getResource("").getPath().replace("/WEB-INF/classes/", "/resources/images/oasisbasic/logo.png");
//            InputStream inputStream = classLoader.getResourceAsStream(path);
//            graphics2D.drawImage(ImageIO.read(inputStream), 206, 1238, 344, 32, null);} catch (Exception e) {e.printStackTrace();}return bufferedImage;}

文字超出换行居中方法:

//换行并居中public Graphics2D makeLineFeed(String text, FontDesignMetrics metrics, int y, int max_width, Graphics2D graphics2D) {int stringlenth = metrics.stringWidth(text);StringBuilder sb = new StringBuilder();int x = 25;//边距// 判断字符长度是否大于图片宽度if (stringlenth > max_width) {int line_width = x;for (int i = 0; i < text.length(); i++) {char c = text.charAt(i);sb.append(c);// FontDesignMetrics 的 charWidth() 方法可以计算字符的宽度int char_width = metrics.charWidth(c);line_width += char_width;// 如果当前字符的宽度加上之前字符串的已有宽度超出了海报的最大宽度,则换行if (line_width >= max_width - 50) {line_width = 0;graphics2D.drawString(sb.toString(), x, y);sb = new StringBuilder();}}//设置第二行居中x = (max_width - metrics.stringWidth(sb.toString())) / 2;graphics2D.drawString(sb.toString(), x, y + metrics.getHeight());} else {x = (max_width - metrics.stringWidth(text)) / 2;graphics2D.drawString(text, x, y);}return graphics2D;}

将二维码转换成图片方法:

 private static BufferedImage toBufferedImage(BitMatrix matrix) {int width = matrix.getWidth();int height = matrix.getHeight();BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);for (int x = 0; x < width; x++) {for (int y = 0; y < height; y++) {image.setRGB(x, y, matrix.get(x, y) ? BLACK : WHITE);}}return image;}

请求参数: ulr:localhost:8088/getClassQr

{"url":"www.baidu.com","className":"计算机应用技术二班","schoolName":"成都理工大学信息科学与技术学院数字媒体系"
}

开发中遇到的坑

1.通过Postman能够获取出海报图片,但是前端获取是获取不到

 解决办法:将post请求换成request请求,去掉@RequestBody注解,具体原因不太了解,如果有知道的同学欢迎评论区指教,谢谢啦!

Spring Boot项目使用Graphics2D 生成二维码海报图片流返回给前端相关推荐

  1. vue 项目中 自动生成 二维码

    vue 项目中 自动生成 二维码 ​ 最近在写一个vue项目,要求根据卡号可以自动生成一个二维码,并渲染在指定位置,因为第一次做类似业务,小编在网上找了找,发现了很多,具体起来主要用的就两种: QRc ...

  2. vue项目中自动生成二维码

    vue项目中自动生成二维码 我们在做vue项目时,很多时候要用到生成二维码的功能,今天给大家介绍一个有前端生成二维码的小例子: 1.安装vue-qr: npm isntall vue-qr --sav ...

  3. 小程序如何生成二维码海报?

    在小程序开发完成之后,我们会时常遇到这样的一个问题,小程序该怎么推广,增加曝光量,让更多的人看到?我们都知道,小程序推广一般是给小程序增加一个分享的功能,可以分享到群里面. 但是不能发朋友圈,若是想发 ...

  4. VUE微信H5生成二维码海报保存在本地相册

    VUE微信H5生成二维码海报保存在本地相册 一.效果 二.说明 公司需求:宣传海报从后台获取,二维码地址也从后台获得,然后生成一个海报,海报上固定位置放二维码,长按图片可以保存在本地相册(其实前面的需 ...

  5. 微信公众平台生成二维码海报是如何做到的?

    实现微信公众号里面点击子菜单生成带有粉丝二维码的海报 关注微信服务号自动生成二维码海报 发送关键词到公众号生成带有粉丝头像昵称的海报二维码 1.从微号帮平台我的公众号 功能管理 2.生成海报二维码 海 ...

  6. 小程序画布合成二维码海报图,并保存到相册

    小程序画布合成二维码海报图,并保存到相册 实现效果如下图: 步骤分析 1,先获取需要合成的海报和二维码. 2,获取图片的本地路径,如果图片不是网络连接则不需要此操作. 3,通过手机型号,根据屏幕的大小 ...

  7. spring boot支付宝沙盒扫二维码支付

    Spring boot整合支付宝沙盒 1.这里没有介绍对支付宝沙盒的密钥和公钥的配置,如没配置请先配置后在看此博客, 有很多不足之处,请多多包涵 2.我使用的是扫码支付,也是就是生成二维码,当然不止有 ...

  8. vue项目使用qrcodejs2生成二维码

    1.安装 cnpm i qrcodejs2 -S 2.使用 template文件 <!-- 二维码弹框 --> <el-button type="primary" ...

  9. thinkphp6项目使用phpqrcode生成二维码

    首先下载phpqrcode扩展文件 phpqrcode下载链接 下载完之后把文件解压到根目录下的vendor中 需要用到的参数: 第一个参数$text,就是代码里的URL网址参数, 第二个参数$out ...

最新文章

  1. mysql在建站起什么作用_数据库操作对比:Sql Server与MYSQL相比有哪些建站优势?...
  2. jQuery.Validate 验证
  3. C++虚函数与多态性
  4. 趣学python3(23)-队列
  5. 中科院信工所经验_2020计算机保研经验贴!(北航、北邮、中科院)
  6. php开发用框架优缺点,剖析PHP开发中主流PHP框架的优缺点
  7. Oracle 单行函数
  8. FreeSql (二十六)贪婪加载 Include、IncludeMany、Dto、ToList
  9. 验证码识别笔记(二)
  10. Linux 高可用(HA)集群之keepalived
  11. 趣谈预留实例券,一文搞懂云上省钱最新玩法
  12. 《算法与数据结构---C语言描述》优先队列
  13. ocelot 配置文件的动态更新
  14. $$a,PHP独有的可变变量
  15. eucalyptus 云平台搭建
  16. Java集合容器面试题(2020最新版),深入理解linux内核百度网盘
  17. Linux设置每分钟、每小时、每天、每周、每月、每年定时执行
  18. FireFox精彩电视广告欣赏
  19. 魔力岛服务器稳定吗,魔力岛《飘渺仙剑》寻找GM你愉我乐线上活动
  20. 【无标题】Windows10安全中心永久关闭教程

热门文章

  1. 网页报错:You don't have permission to access
  2. 一盒两用——破解移动IPTV机顶盒为两用安卓机顶盒
  3. ajax带参数get,使用jQuery ajax方法传递GET参数
  4. Vulnhub靶场之symfonos:1
  5. 计算机音乐奇迹再现乐谱,天谕手游奇迹再现乐谱_奇迹再现乐谱代码分享_3DM手游...
  6. 洛谷 P1348 Couple number
  7. 产品经理的5分钟统计课:产品/用户/数据平均情况是怎样?
  8. 1438oracle,一次ora-01438错误的处理
  9. 用计算机谈狂狼,抖音狂狼原唱是谁 抖音狂狼完整版歌词
  10. java输出格林威治时间_Java之格林威治时间格式转换成北京时间格式