继续上一篇文章的延续,二维码生成好的,那么就把他画到海报上吧。

样例(图一是效果图,图二是模板)。

工程代码

               

那么这里涉及到的知识如下。

  • 绘制单文字
  • 绘制换行文字
  • 绘制头像
  • 绘制二维码

绘制单行文字

    /*** 绘制海报文字(默认微软雅黑/PLAIN/32)* * @param graphics*            画笔* @param text*            文本* @param width*            坐标 x* @param height*            坐标 y* @param color*            颜色* @param font*            字体* @return*/public static Graphics2D drawText(Graphics2D graphics, String text, int width, int height, Color color, Font font) {// 抗锯齿graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);if (font == null) {font = new Font("微软雅黑", Font.PLAIN, 32);}graphics.setFont(font);graphics.setPaint(new Color(0, 0, 0, 64));// 先绘制一遍底色graphics.drawString(text, width, height);graphics.setPaint(color);// 再绘制一遍文字// 由于部分情况会出现文字模糊的情况,保险起见才出此对策。graphics.drawString(text, width, height);return graphics;}

绘制多行文字(代码比较冗余,有更好的办法也请告知我一下)

/*** 绘制海报文字(换行)* * @param graphics*            画笔* @param text*            文本* @param width*            位置:x* @param height*            位置:y* @param lineHeight*            单行行高* @param linewidth*            单行行宽* @param color*            文本颜色* @param textSize*            文本字体大小* @param limitLineNum*            限制行数* @param backgroundWidth*            底背位置(多行文字绘制时,出现为单行时居中的区域宽度。)* @return*/public static int drawTextNewLine(Graphics2D graphics, String text, int width, int height, int lineHeight,int lineWidth, Color color, int textSize, int limitLineNum, int backgroundWidth) {Font font = new Font("微软雅黑", Font.PLAIN, textSize);graphics.setFont(font);graphics.setPaint(color);FontRenderContext frc = graphics.getFontRenderContext();graphics.getFontRenderContext();Rectangle2D stringBounds = font.getStringBounds(text, frc);double fontWidth = stringBounds.getWidth();List<String> lineList = new ArrayList<String>();int lineCharCountSub = 0;// 不满一行if (fontWidth <= lineWidth) {lineList.add(text);if (backgroundWidth > 0) {width = (backgroundWidth - Double.valueOf(fontWidth).intValue()) / 2;}} else {if (backgroundWidth > 0) {width = (backgroundWidth - lineWidth) / 2;}// 输出文本宽度,这里就以画布宽度作为文本宽度测试int textWidth = lineWidth;// 文本长度是文本框长度的倍数double bs = fontWidth / textWidth;// 每行大概字数int lineCharCount = (int)Math.ceil(text.length() / bs);lineCharCountSub = lineCharCount;int beginIndex = 0;while (beginIndex < text.length()) {int endIndex = beginIndex + lineCharCount;if (endIndex >= text.length()) {endIndex = text.length();}String lineStr = text.substring(beginIndex, endIndex);Rectangle2D tempStringBounds = font.getStringBounds(lineStr, frc);int tzzs = 1;while (tempStringBounds.getWidth() > textWidth) {lineStr = lineStr.substring(0, lineStr.length() - tzzs);tempStringBounds = font.getStringBounds(lineStr, frc);}lineList.add(lineStr);beginIndex = beginIndex + lineStr.length();}}// Color.BLACK 。字体颜色graphics.setPaint(color);if (lineHeight == 0) {lineHeight = 35;}// 限行int lineNum = lineList.size();if (limitLineNum != 0 && lineNum > limitLineNum) {lineNum = limitLineNum;}// 绘制 换行文字for (int i = 0; i < lineNum; i++) {String lineStr = lineList.get(i);if (lineNum >= 2 && i == lineNum - 1) {if (lineStr.length() >= lineCharCountSub - 3) {lineStr = lineStr.substring(0, lineStr.length() - 2) + "...";}}graphics.drawString(lineStr, width, height + (i + 1) * lineHeight);graphics.drawString(lineStr, width, height + (i + 1) * lineHeight);}return lineNum;}

绘制 头像(带边角圆框)

   /*** 绘制 头像* * @param graphics* @param avatarUrl* @param bufferImage* @param x* @param y* @return* @throws Exception*/public static Graphics2D drawAvatar(Graphics2D graphics, String avatarUrl, BufferedImage bufferImage, int x, int y)throws Exception {// 绘制头像 。BufferedImage logoBufferImage = null;if (avatarUrl.startsWith("http")) {logoBufferImage = Thumbnails.of(new URL(avatarUrl)).size(70, 70).asBufferedImage();} else {logoBufferImage = Thumbnails.of(new File(avatarUrl)).size(70, 70).asBufferedImage();}int height2 = logoBufferImage.getHeight();// 图片变圆int border = 2;Ellipse2D.Double shapeEll =new Ellipse2D.Double(x + border, y + border, height2 - border * 2, height2 - border * 2);// 抗锯齿graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);graphics.setClip(shapeEll);// TODO 绘制头像graphics.drawImage(logoBufferImage, x, y, null);// 为了防止 头像圆角之后锯齿问题。需要在头像周围画一个白框覆盖即可。// 需要重新获取画笔对象。graphics = bufferImage.createGraphics();graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);int border2 = 2;Stroke s = new BasicStroke(2f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);graphics.setStroke(s);graphics.setColor(Color.WHITE);// TODO 绘制头像边框graphics.drawOval(x + border, y + border, height2 - border2 * 2, height2 - border2 * 2);return graphics;}

绘制 二维码。(这个就比较简单了,没有什么过多的额外处理,直接定位位置就可以了)

  /*** 绘制 图片* * @param graphics*            画笔* @param bufferImage*            图片资源* @param x*            坐标 x* @param y*            坐标 y* @return* @throws Exception*/public static Graphics2D drawImage(Graphics2D graphics, BufferedImage bufferImage, int x, int y) throws Exception {graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);graphics.drawImage(bufferImage, x, y, null);return graphics;}

OK 。

不足之处还请留言探讨。

部分代码参考前人分享的资料,笔者只是做了实践运用和整理。

Java 动态生成推广海报,带用户头像、昵称、二维码相关推荐

  1. java 生成带网络头像的二维码

    最近做一个带微信头像的二维码的功能,微信头像是一个链接,所以先把微信头像下载,临时保存,生成二维码 /*** 文件下载工具类** @author zhengxinghua*/ public class ...

  2. Java 绘制带圆角头像的二维码

    导入相关的jar包 <!--Qrcode creator--><dependency><groupId>com.google.zxing</groupId&g ...

  3. 小程序生成海报,含用户头像用户名二维码和背景图

    如果是本地资源文件,直接将data中需要绘制的图片路径赋值即可.我的需求是接口返回数据,绘制生成图片保存手机. 首先在微信公众平台填写安全域名,每个月只有5次配置域名机会,还有两次(瑟瑟发扌斗) 设置 ...

  4. Vue页面生成分享海报最详说明(含二维码+多种水印方式+常见的坑处理)

    功能需求: 海报有1张背景图, 海报上的文案内容动态变化 在背景图的某个位置上添加二维码图片 水印功能 大致思路 html页面部分, 包括背景图,接口得来的数据,以及二维码图片的位置 使用 qrcod ...

  5. Java 代码基于开源组件生成带头像的二维码

    二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...

  6. Java 代码基于开源组件生成带头像的二维码,推荐收藏

    二维码在我们目前的生活工作中,随处可见,日常开发中难免会遇到需要生成二维码的场景,网上也有很多开源的平台可以使用,不过这里我们可以通过几个开源组件,自己来实现一下. 在动手之前我们先思考一下需要进行的 ...

  7. uniapp之小程序端生成分享海报(带自定义参数的二维码)

    内容需求: 小程序端生成一个海报,海报内容包括当前授权账号的头像,当前授权账号的邀请码,一张特定图片,分享页面的带对应参数的小程序二维码:生成的海报需要保存到本地 功能方法: 1.前端用canvas绘 ...

  8. 微信公众号带场景参数的二维码生成与使用?

    2019独角兽企业重金招聘Python工程师标准>>> 微信公众号推广时,用户通过扫码关注公众号,统计用户是通过哪个带场景二维码进行关注的,并对用户自动分组打标签备注.直接使用微号帮 ...

  9. 如何生成带统计参数的二维码渠道监测

    随着互联网技术的发展,二维码成为App流量分发的主流形式,我们能在各种不同的场合看到扫码入口.这种形式的App推广相较于链接.应用商店而言更加简单灵活,既能打通线上线下的信息通道,也可以植入到图文内容 ...

最新文章

  1. SDUT 贪心算法 删数问题
  2. android开机启动c程序,如何让A20,android开机自动启动C程序【转】
  3. ssm打印sql如何开启_mybatis怎么配置log4j打印出sql语句
  4. ECMAScript arguments 对象(摘自W3C)
  5. Python编写简易木马程序
  6. python抽奖滚动界面_Python使用Tkinter实现转盘抽奖器的步骤详解
  7. android标题栏上增加按钮,Android:向自定义标题栏添加按钮
  8. “音”你而来,“视”而可见 腾讯云+社区音视频技术开发实战沙龙圆满结束...
  9. visual foxpro 程序员指南_1024程序员节:盘点小红书今年发生的重要bug
  10. Eclipse中JSP生成的class文件去了哪里?
  11. pandas把'm8[ns]'类型转换为int类型进行运算
  12. 日志易产品使用系列二:使用日志易 SaaS 版本完成一次 JSON 日志分析
  13. kubectl命令补全
  14. kafka-producer-network-thread | producer-2|||Metadata--->[Producer clientId=producer-2] Cluster ID:
  15. (病毒安全)服务器被中了木马,如何清除
  16. 岛屿数量vs最大正方形
  17. pat甲级考试报名费_2019吉林省公务员考试笔面心得
  18. 16S 物种丰度热图学习
  19. [附源码]计算机毕业设计的高校资源共享平台Springboot程序
  20. Jsp和Javascript读写cookie,cookie的path设置,jsp解码cookie值

热门文章

  1. 不同分辨率对应的像素输出时钟以及同步信号参数的整理
  2. 网上播放.flv格式的二种程序
  3. php文字链接下划线怎么取消,css怎么去掉超链接下划线
  4. 【分享-免费OCR工具 在线+移动端】免费在线图片多国文字识别
  5. NAVICAT 还原mssql bak备份文件
  6. 硬盘为raw格式后的修复
  7. 腾讯云七月优惠活动云服务器限量秒杀20元起
  8. 直立车各环的调试_大学生智能车竞赛之直立车控制,我之初见(四)
  9. 《翻转组件库之init项目》
  10. java lua_请问该如何在Java中使用Lua脚本语言?