参考网站

https://my.oschina.net/u/2426590/blog/3027726

java Graphics2D绘制文字并居中并解决服务器乱码问题

https://blog.csdn.net/w410589502/article/details/72898184

我自己的代码:


import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Transparency;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.net.URL;import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import com.platform.annotation.IgnoreAuth;
import com.platform.utils.util.OssUtil;@Controller
@RequestMapping(value = "/api/img")
public class ImageUtil {static final String IMAGE_SUFFIX = ".png";/*** @param posterImgUrl*            海报* @param tempQrCodeImgUrl*            临时二维码* @param headImgUrl*            头像 nameText 昵称 cqText 二维码文字* @return 合成图片地址*/public static String drawImage(String posterImgUrl, String tempQrCodeImgUrl, String headImgUrl, String nameText,String cqText) throws IOException {int width = 620;int height = 1004;BufferedImage bgBufImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// RGB形式Graphics2D bgBufImageGraphics = bgBufImage.createGraphics();bgBufImageGraphics.setBackground(Color.WHITE);// 设置背景色bgBufImageGraphics.clearRect(0, 0, width, height);// 通过使用当前绘图表面的背景色进行填充来清除指定的矩形。// bgBufImageGraphics.setBackground(new Color(255,255,255));bgBufImageGraphics.setPaint(Color.black);// 设置画笔,设置Paint属性Font font = new Font("宋体", Font.PLAIN, 28);bgBufImageGraphics.setFont(font);// 抗锯齿bgBufImageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 计算文字长度,计算居中的x点坐标FontMetrics fm = bgBufImageGraphics.getFontMetrics(font);int textWidth = fm.stringWidth(nameText);// int widthX = (width - textWidth) / 2;int widthX = 128;// 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。bgBufImageGraphics.drawString(nameText, widthX, 926);// 计算文字长度,计算居中的x点坐标// int widthX = (width - textWidth) / 2;int cqCodeWidthX = 372;// 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。bgBufImageGraphics.drawString(cqText, cqCodeWidthX, 958);// BufferedImage posterBufImage = ImageIO.read(new URL(posterImgUrl));// //直接使用图片做背景,自定义背景使用上面方式// Graphics2D posterBufImageGraphics = posterBufImage.createGraphics();BufferedImage posterBufImage = ImageIO.read(new URL(posterImgUrl));BufferedImage qrCodeImage = ImageIO.read(new URL(tempQrCodeImgUrl));BufferedImage headImage = ImageIO.read(new URL(headImgUrl));// 设置圆形头像BufferedImage roundHeadImg = new BufferedImage(headImage.getWidth(), headImage.getHeight(),BufferedImage.TYPE_INT_RGB);Graphics2D roundHeadGraphics = roundHeadImg.createGraphics();Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, roundHeadImg.getWidth(), roundHeadImg.getHeight());roundHeadGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);roundHeadImg = roundHeadGraphics.getDeviceConfiguration().createCompatibleImage(headImage.getWidth(),headImage.getHeight(), Transparency.TRANSLUCENT);roundHeadGraphics = roundHeadImg.createGraphics();// 使用 setRenderingHint 设置抗锯齿roundHeadGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);roundHeadGraphics.setClip(shape);roundHeadGraphics.drawImage(headImage, 0, 0, null);roundHeadGraphics.dispose();// bgBufImageGraphics.drawImage(qrCodeImage, (posterBufImage.getWidth()// - qrCodeImage.getWidth()), 10, qrCodeImage.getWidth(),// qrCodeImage.getHeight(), null);// posterBufImageGraphics.drawImage(roundHeadImg, 50, 100,// HEAD_URL_WIDTH, HEAD_URL_HEIGHT, null);bgBufImageGraphics.drawImage(qrCodeImage, 444, 848, 72, 72, null);bgBufImageGraphics.drawImage(roundHeadImg, 32, 876, 80, 80, null);bgBufImageGraphics.drawImage(posterBufImage, 0, 0, 620, 826, null);bgBufImageGraphics.dispose();ByteArrayOutputStream bs = new ByteArrayOutputStream();ImageOutputStream imgOut = ImageIO.createImageOutputStream(bs);ImageIO.write(bgBufImage, "png", imgOut);// 上传到服务器上// InputStream inSteam = new ByteArrayInputStream(bs.toByteArray());// String url = OSSFactory.build().uploadSuffix(inSteam, IMAGE_SUFFIX);// 上传到服务器上String url = OssUtil.uploadObject2OSS(bs.toByteArray());return url;// 返回合成的图片地址url}public static void drawImage() throws IOException {// 海报图// String backgroundImageUrl =// "http://img1.juimg.com/171010/330841-1G01000050879.jpg";String backgroundImageUrl = "http://diaosaas-prod.oss-cn-shenzhen.aliyuncs.com/education/155547979572510070.jpg";// 二维码String qrCodeImageUrl = "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553504957130&di=02fae20a5c0f885d52299b2b1d682c86&imgtype=0&src=http%3A%2F%2Fimg.atobo.com%2FProductImg%2FEWM%2FUWeb%2F3%2F2%2F1%2F3%2F061%2F3213061%2F1.gif";// 头像// String headUrl =// "http://pic.51yuansu.com/pic3/cover/00/63/25/589bdedf5475d_610.jpg";String headUrl = "http://thirdwx.qlogo.cn/mmopen/vi_32/ZW8dgKbUicrCdotRItMTpAaxibAwj6nVMJvQoGLyKbaRvah93dXWrENSoum20dKicnJqd2xh1U4NhmC41L7q2Gwqg/132";String nameText = "古月争取";String cqText = "扫一扫,为我加油!";int width = 310;int height = 502;BufferedImage bgBufImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// RGB形式Graphics2D bgBufImageGraphics = bgBufImage.createGraphics();bgBufImageGraphics.setBackground(Color.WHITE);// 设置背景色bgBufImageGraphics.clearRect(0, 0, width, height);// 通过使用当前绘图表面的背景色进行填充来清除指定的矩形。// bgBufImageGraphics.setBackground(new Color(255,255,255));bgBufImageGraphics.setPaint(Color.black);// 设置画笔,设置Paint属性Font font = new Font("宋体", Font.PLAIN, 14);bgBufImageGraphics.setFont(font);// 抗锯齿bgBufImageGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 计算文字长度,计算居中的x点坐标FontMetrics fm = bgBufImageGraphics.getFontMetrics(font);int textWidth = fm.stringWidth(nameText);// int widthX = (width - textWidth) / 2;int widthX = 64;// 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。bgBufImageGraphics.drawString(nameText, widthX, 463);// 计算文字长度,计算居中的x点坐标// int widthX = (width - textWidth) / 2;int cqCodeWidthX = 186;// 表示这段文字在图片上的位置(x,y) .第一个是你设置的内容。bgBufImageGraphics.drawString(cqText, cqCodeWidthX, 479);BufferedImage posterImage = ImageIO.read(new URL(backgroundImageUrl));BufferedImage qrCodeImage = ImageIO.read(new URL(qrCodeImageUrl));BufferedImage headImage = ImageIO.read(new URL(headUrl));// 设置圆形图片BufferedImage roundHeadImg = new BufferedImage(headImage.getWidth(), headImage.getHeight(),BufferedImage.TYPE_INT_RGB);Graphics2D roundHeadGraphics = roundHeadImg.createGraphics();Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, roundHeadImg.getWidth(), roundHeadImg.getHeight());roundHeadGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);roundHeadImg = roundHeadGraphics.getDeviceConfiguration().createCompatibleImage(headImage.getWidth(),headImage.getHeight(), Transparency.TRANSLUCENT);roundHeadGraphics = roundHeadImg.createGraphics();// 使用 setRenderingHint 设置抗锯齿roundHeadGraphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);roundHeadGraphics.setClip(shape);roundHeadGraphics.drawImage(headImage, 0, 0, null);roundHeadGraphics.dispose();bgBufImageGraphics.drawImage(qrCodeImage, 444, 848, 72, 72, null);// bgBufImageGraphics.drawImage(qrCodeImage, (bgBufImage.getWidth() -// qrCodeImage.getWidth()), 10, qrCodeImage.getWidth(),// qrCodeImage.getHeight(), null);bgBufImageGraphics.drawImage(roundHeadImg, 32, 876, 80, 80, null);bgBufImageGraphics.drawImage(posterImage, 0, 0, 620, 826, null);bgBufImageGraphics.dispose();ImageIO.write(bgBufImage, "png", new File("E:\\demo1.png"));System.out.println("生成图片完成");}/*** 上传到网络* * @author LHB* @since JDK 1.8*//** public static void main(String[] args) throws IOException { //海报图 String* backgroundImageUrl =* "http://47.92.209.5:8080/upload/15460848171054280132559.jpg"; // String* backgroundImageUrl =* "http://img1.juimg.com/171010/330841-1G01000050879.jpg"; //二维码 // String* qrCodeImageUrl =* "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553504957130&di=02fae20a5c0f885d52299b2b1d682c86&imgtype=0&src=http%3A%2F%2Fimg.atobo.com%2FProductImg%2FEWM%2FUWeb%2F3%2F2%2F1%2F3%2F061%2F3213061%2F1.gif";* String qrCodeImageUrl =* "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQE18TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNEhIcXBjNk1mZzExMDAwMDAwN0UAAgR-AMNcAwQAAAAA";* //头像 String headUrl =* "http://thirdwx.qlogo.cn/mmopen/vi_32/J8e7icsMJ9r122G4h349YdB3WewUyaICxuoqC0HsaHDOfuRibPiclcOP8mnfQ5FoZLA1Q9SCe9SH46H72U25rAG9A/132";* // String headUrl =* "http://pic.51yuansu.com/pic3/cover/00/63/25/589bdedf5475d_610.jpg";* * String nameText = "古月争取"; String cqText = "扫一扫,为我加油!"; String url =* ImageUtil.drawImage(backgroundImageUrl, qrCodeImageUrl,* headUrl,nameText,cqText); System.out.println("url={} "+url);* * * }*/// 上传到本地// public static void main(String[] args) throws IOException {// drawImage();//// }@IgnoreAuth@RequestMapping("/testIMG")public void test() throws IOException {// 海报图String backgroundImageUrl = "http://47.92.209.5:8080/upload/15460848171054280132559.jpg";// String backgroundImageUrl =// "http://img1.juimg.com/171010/330841-1G01000050879.jpg";// 二维码// String qrCodeImageUrl =// "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1553504957130&di=02fae20a5c0f885d52299b2b1d682c86&imgtype=0&src=http%3A%2F%2Fimg.atobo.com%2FProductImg%2FEWM%2FUWeb%2F3%2F2%2F1%2F3%2F061%2F3213061%2F1.gif";String qrCodeImageUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=gQE18TwAAAAAAAAAAS5odHRwOi8vd2VpeGluLnFxLmNvbS9xLzAyNEhIcXBjNk1mZzExMDAwMDAwN0UAAgR-AMNcAwQAAAAA";// 头像String headUrl = "http://thirdwx.qlogo.cn/mmopen/vi_32/J8e7icsMJ9r122G4h349YdB3WewUyaICxuoqC0HsaHDOfuRibPiclcOP8mnfQ5FoZLA1Q9SCe9SH46H72U25rAG9A/132";// String headUrl =// "http://pic.51yuansu.com/pic3/cover/00/63/25/589bdedf5475d_610.jpg";String nameText = "古月争取";String cqText = "扫一扫,为我加油!";String url = ImageUtil.drawImage(backgroundImageUrl, qrCodeImageUrl, headUrl, nameText, cqText);System.out.println("url={} " + url);}
}

java合成海报的工具类(二维码、头像、海报)相关推荐

  1. java生成二维码与海报合并组装在一起后产出Base64字符串

    闲来无事给大家分享一个,java后端动态生成二维码,并与海报进行合并的工具类 先上效果图: 这是我从网上随便找了海贼王的海报,并用百度的链接生成了一个二维码,合并而成,废话少说直接上代码: 动态生成二 ...

  2. java利用core 工具实现二维码的生成与解析

    java利用core 工具实现二维码的生成与解析 简单介绍下二维码:二维码其实就是一种编码技术,只是这种编码技术是用在图片上了,将给定的一些文字,数字转换为一张经过特定编码的图片,而解析二维码则相反, ...

  3. java生成二维码 推广海报添加二维码 文字水印 二维码添加LOGO

    前言 场景: 一.推广海报贴上二维码,用户扫码跳转             二.二维码中间贴logo   eg:这里使用展示第一种场景 一.使用工具 Google开源项目ZXing(二维条码编解码). ...

  4. Java 线程 - 基础及工具类 (二)

    Java 并发系列文章 Java 线程 - 并发理论基础(一) Java 线程 - 基础及工具类 (二) Java 线程 - 并发设计模式 (三) Java 线程(二) 通用的线程生命周期 Java ...

  5. Java中如何实现QR(二维码)的生成

    二维码在我们的日常生活中的使用现在可谓是如火如荼.二维码,即一种新生代的信息存储介质.最早被使用在汽车生产厂,用于跟踪售后的汽车. 同样,在互联网时代,二维码也被广泛使用,随着二维码的迅速发展,一些手 ...

  6. thinkphp生成带二维码的海报

    阿里云搞活动,想要抓紧买 用thinkphp生成带二维码的海报功能. 准备:公众号二维码图片一张 背景图片一张 将二维码和背景图片合成的方法,可添加到common/common/function.ph ...

  7. 微信小程序——weapp-qrcode.js生成二维码、海报二维码、核销码

    各位小伙伴们,不知道你们在开发的时候有没有遇到小程序生成二维码,生成海报时候带上二维码.核销码等等. 那么,小程序端该如何生成二维码图片呢? 效果如下: weapp-qrcode.js 小伙伴们可以来 ...

  8. js 通过canvas生成带二维码的海报图

    前言 h5移动端生成海报图,可长按图片保存或发送给朋友,或长按识别二维码.两种场景:第一种是生成项目分享海报图,通过背景图和地址生成的二维码合成一张海报图:第二种是通过页面生成商品海报图,页面有产品介 ...

  9. uniapp微信小程序生成带个人二维码的海报

    1:Sansnn-uQRCode 导入插件(生成二维码)(插件市场)(源码和结果如下) 2:弹窗展示海报内容 3:createCanvasImage绘制canvas海报 4:canvasToTempF ...

最新文章

  1. Hyperledger Fabric权限进阶篇
  2. 来,聊聊程序员的爱情
  3. Java多线程(十)之ReentrantReadWriteLock深入分析
  4. Vue 框架-05-动态绑定 css 样式
  5. [网络流24题-6]孤岛营救问题
  6. 2能不用cuda_洗洁精不用花钱买,自己在家2毛钱能做一大瓶,效果比买的还好!...
  7. ASP.NET服务器控件查询
  8. Hive中元数据表的含义
  9. red hat linux没有库文件libiconv.so,libiconv库链接问题一则(备忘)
  10. Spark核心概念与案例拆解
  11. 基于C++实现考试报名系统
  12. 【C++】 文件提取英文单词
  13. 兔子与狐狸c语言,狐狸和兔子
  14. Cox 比例风险模型中HR和置信区间
  15. android获取系统资源文件,Android 系统文件获取
  16. 微分流形与黎曼几何学习笔记(转自http://blog.sciencenet.cn/home.php?mod=spaceuid=81613do=blogid=333317)
  17. 京东java电话面试问题_【京东Java面试】京东电话技术面试,面试题目完全没思路。-看准网...
  18. OpenWrt软路由安装可道云
  19. 【JZOJ】2867. Contra
  20. 如何给文件批量重命名?

热门文章

  1. html5 人在星空中,人类在宇宙中就像一粒尘埃?看完这5张图片,谜底就揭晓了...
  2. c226打印机驱动安装_打印机驱动怎么装?网络打印机驱动的安装方法
  3. android gradle 多渠道打包小结
  4. 新程序猿如何度过试用期
  5. my firefox常用的插件介绍
  6. 利用python进行数据分析数据集_《利用Python进行数据分析》终章·数据分析案例·学习笔记(二)...
  7. 洛谷P1462 通往奥格瑞玛的道路
  8. 【04】制作一个鸿蒙应用-【先写一下最基本的前端代码】-优雅草科技伊凡
  9. No qualifying bean of type 'com.xxx.xx.service.xxService' available: expected at leas
  10. linux 网络属性,Linux网络属性配置详解