由于项目需求,需要通过上传的字体文件来生成对应的图片以方便用户快速查看字体效果,经查阅信息后完成此需求,记录下此以供日后学习巩固。根据思路,首先是获取到字体文件的url,然后根据url获取到字体文件,对字体文件进行操作,最后生成图片。以下为代码部分。第一步,获取到字体文件url并通过url获取到字体文件其中,有一个根据字体长度来设置字体大小的判断,主要是因为字体字符的长度不一,所以为了防止过长字体展示不完全做了一个判断,尽量让长短不一的字体都能适应在图片内。(比如宋体是两个字,方正兰亭细黑简体有八个字)由于目前的需求是返回生成图片的url,故会将生成的图片上传到自己的服务器并返回图片url更新字体文件,所以会对文件进行加密等操作,处理文件名之后的可以忽略。设置好图片宽高后即可调用createImage生成图片(期间遇到过一个bug是在本地测试时生成的字体正常为中文,然后上服务器后却变成了英文,查了一下大致是Windows和Linux环境导致的,但不是很了解,如有大神了解,欢迎指导。最终在获取字体名称时设定了一个值解决问题Locale.SIMPLIFIED_CHINESE)。
     public void strToPic(FontFile fontfile){BufferedImage bufferedImage = null;HttpURLConnection httpConn = null;//获取问号前的地址String fontUrl = fontFile.getFileUrl().split("\\?")[0];//根据url获取到服务器中的字体文件try {URL url = new URL(fontUrl);httpConn = (HttpURLConnection) url.openConnection();httpConn.connect();InputStream inputStream = httpConn.getInputStream();//设定字体大小float fontSize;//创建font对象Font dynamicFont = Font.createFont(Font.TRUETYPE_FONT, inputStream);int fontLength = dynamicFont.getFontName().length();//根据字体长度来设置字体大小if(fontLength > 15){fontSize = 50 ;}else {fontSize = 65 ;}Font dynamicFontPt = dynamicFont.deriveFont(fontSize);//图片宽高Integer width = 900;Integer height = 675;String type = "png";//处理文件名String withTypeFileName = fontFile.getFileUrl().substring(0,fontFile.getFileUrl().indexOf("?"));String fileName = withTypeFileName.substring(0,withTypeFileName.indexOf("."));String realFileName = fileName + "." + type;String cephFileName = cephService.handleFileName(realFileName);//创建图片对象try {bufferedImage = createImage(dynamicFontPt.getFontName(Locale.SIMPLIFIED_CHINESE), dynamicFontPt,  width, height, 0, 0);if(ObjectUtils.isEmpty(bufferedImage)){throw new BusinessException("创建图片失败");}//上传到cephcephService.uploadFile(bufferedImage,cephFileName);//获取到生成图片的urlString imageUrl = cephService.getFileUrlByFileName(cephFileName);fontFile.setImageUrl(imageUrl);fontFileMapper.updateById(fontFile);//同步到esesFontService.batchUpdateESFont(fontFile);} catch (Exception e) {e.printStackTrace();}}catch (Exception e){e.printStackTrace();}}
 第二步,生成图片根据第一步传入的参数调用该方法可返回一个bufferedImage对象,具体需要什么可根据自己的需求进行修改
 /*** 根据输入的参数在对应路径生成对应的png格式图片字体,背景为透明** @param str     文字* @param font    字体类型//     * @param outFile 图片输出路径* @param width   图片宽度* @param height  图片高度* @param x       文字的横坐标(为0代表需要程序自动计算)* @param y       文字的纵坐标(为0代表需要程序自动计算)* @throws Exception Exception*/private static BufferedImage createImage(String str, Font font,Integer width, Integer height, int x, int y) throws Exception {// 创建BufferedImage对象BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);// 获取Graphics2DGraphics2D g2d = image.createGraphics();// ----------  增加下面的代码使得背景透明  -----------------image = g2d.getDeviceConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);g2d.dispose();g2d = image.createGraphics();// ----------  背景透明代码结束  -----------------//设置字体颜色g2d.setColor(Color.black);//消除字体的锯齿g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);// 设置字体类型g2d.setFont(font);//用于获得垂直居中FontMetrics fm = g2d.getFontMetrics(font);int ascent = fm.getAscent();int descent = fm.getDescent();if (x == 0) {x = (width - fm.stringWidth(str)) / 2;}if (y == 0) {y = (height - (ascent + descent)) / 2 + ascent;}// 将字符写入到图片内g2d.drawString(str, x, y);//释放对象g2d.dispose();// 保存文件return image;}
 在开发中查阅了很多资料,但由于记录此文章时离开发过于久远,故不能将相关资料逐一列举,如有侵权,请联系删除。欢迎大家一起学习!

通过上传ttf或者otf字体文件生成对应字体的图片相关推荐

  1. 将文件上传至ftp服务器,FTP文件上传工具类,将文件上传至服务器指定目录

    将文件上传至ftp服务器,传入File对象,将文件上传至ftp服务器 需要配置修改的点: 1. 服务器ip端口(服务器ip 端口22/21). 2. 服务器账号密码(服务器登录用户名密码). 3. 上 ...

  2. php dw文件上传下载,使用PHP实现文件上传

    这里使用PHP实现文件的上传,由在浏览器这边选择文件,上传到服务器.其中,在上传文件中,考虑到对上传文件大小的限制.类型限制等问题.(当然可以根据我们需要修改对上传的文件的限制,而一般而言php自身也 ...

  3. 大文件上传服务器:支持超大文件HTTP断点续传的实现办法

    点击上方蓝色"方志朋",选择"设为星标"回复"666"获取独家整理的学习资料! 来源:blog.csdn.net/ababab12345/a ...

  4. Linux环境Shell脚本上传下载阿里云OSS文件

    为什么80%的码农都做不了架构师?>>>    Linux环境Shell脚本上传下载阿里云OSS文件 背景 工作中由于我们项目生成的日志文件比较重要,而本地磁盘空间有限存储不了多久, ...

  5. ie6多文件上传_一个好的“文件上传”功能必须要注意的这些点你都知道吗?

    检查上传文件扩展名白名单,不属于白名单内,不允许上传:[前端和后端都要做好校验] 上传文件的目录必须是http请求无法直接访问到的.如果需要访问的,必须上传到其他(和web服务器不同的)域名下,并设置 ...

  6. 【FTP】java FTPClient 文件上传内容为空,文件大小为0

    问题:如题所述,使用FTPClient上传至FTP服务器, 表现如下:①文件大小为0 ②上传很小的文件,但是要花费很长的时间,20K要花费2分钟甚至更久 ③没有任何的报错,没有任何的乱码 解决方法: ...

  7. php上传文件自动删除,jsp-解决文件上传后重启Tomcat时文件自动删除问题

    吼吼,我遇到的问题是这样的...... 我写了一个图片上传的方法,上传时,判断没有这个目录就自动建立一个.然后开始上传图片,能成功,能在服务器找到文件夹和相应的文件.但是,重启项目,或者清理缓存之后, ...

  8. SmartUpload上传下载及文件名和文件内容中文问题

    一.安装篇 jspSmartUpload是由www.jspsmart.com网站开发的一个可免费使用的全功能的文件上传下载组件,适于嵌入执行上传下载操作的JSP文件中.该组件有以下几个特点: 1.使用 ...

  9. lumen 支持多文件上传及php 原生多文件上传

    1.webform (注意:name后面一定要加[]号) <form method="post" enctype="multipart/form-data" ...

最新文章

  1. FM-2018-大熊猫的肠道菌群可能并没有特化出发酵纤维素的能力
  2. mybatis自动生成bean
  3. php 查看mysql连接数据库_php基础之连接mysql数据库和查询数据
  4. Java: for(;;) vs. while(true)
  5. MPI编程的常用接口速查
  6. web页面在线编辑功能
  7. HDU1850 Being a Good Boy in Spring Festival【Nim博弈】
  8. 得具备点靠钱赚钱的能力
  9. 如何打开屏幕坏的手机_手机屏幕坏了怎么打开usb调试
  10. CSS RESET —— 浏览器样式重置
  11. 数电笔记之无关项化简逻辑函数
  12. SylixOS ECS 启动过程
  13. Kubernetes集群部署篇( 一)
  14. 无轴螺旋输送机的安装可是一门技术活
  15. 人类简史 十一章 帝国的愿景
  16. Java课程设计税率_梁勇(Danniel Liang) java教材例题:java程序购买额按税率求营业税 java中数值保留2位小数的方法...
  17. Jetson TX2零基础学习(一)——连线、刷机
  18. 钢材表面缺陷检测分类不同图像增强方式的对比研究
  19. neo4j图数据库基本概念
  20. 计算机考试重点题目与答案

热门文章

  1. Mysql之innodb
  2. 牛客竞赛 Youhane Assembler
  3. 《数字图像处理》学习总结及感悟:第二章数字图像基础(2)电磁波、传感器及辐射成像原理
  4. 华为codecraft算法大赛---寻路
  5. php调用ipmi,[转载]Linux IPMI 安装配置实用
  6. Hone蓝牙钥匙扣 iPhone轻松找钥匙
  7. antd a-tooltip修改背景颜色及箭头小三角形颜色,自定义背景颜色
  8. 全数字摄影测量系统应用(4D)
  9. Spring中常见的注解收集
  10. 【论文笔记】SPAN: Spatial Pyramid Attention Network for Image Manipulation Localization