千锋教育-做有情怀、有良心、有品质的IT职业教育机构

Java入门教程之如何实现长图文生成?

时间:2017-08-22 09:57:57  |  来源:千锋教育郑州校区  |  作者:

   使用微博、微信的用户都会发现,朋友圈中有的文章中都是直接一张长图文表述。使用长图文可以足各种宣传需求,与社交分享无缝集成,扫一扫轻松分享。那么,使用Java开发如何实现长图文生成呢?

java长图文.jpg

  目标

  首先定义下我们预期达到的目标:根据文字 + 图片生成长图文

  目标拆解

  1)支持大段文字生成图片

  2)支持插入图片

  3)支持上下左右边距设置

  4)支持字体选择

  5)支持字体颜色

  6)支持左对齐,居中,右对齐

  预期结果

  我们将通过spring-boot搭建一个生成长图文的http接口,通过传入参数来指定各种配置信息,下面是一个终调用的示意图

  设计&实现

  长图文的生成,采用awt进行文字绘制和图片绘制

  1. 参数选项 ImgCreateOptions

  根据我们的预期目标,设定配置参数,基本上会包含以下参数

  2. 封装类 ImageCreateWrapper

  封装配置参数的设置,绘制文本,绘制图片的操作方式,输出样式等接口

  3. 内容填充 GraphicUtil

  具体的内容填充,区分为文本绘制和图片绘制

  设计

  考虑到在填充的过程中,可以自由设置字体,颜色等,所以在我们的绘制方法中,直接实现掉内容的绘制填充,即 drawXXX 方法真正的实现了内容填充,执行完之后,内容已经填充到画布上了。

  图片绘制,考虑到图片本身大小和终结果的大小可能有冲突,采用下面的规则

  绘制图片宽度 <=(指定生成图片宽 - 边距),全部填充

  绘制图片宽度 >(指定生成图片宽 - 边距),等比例缩放绘制图片

  文本绘制,换行的问题

  每一行允许的文本长度有限,超过时,需要自动换行处理

  文本绘制

  考虑基本的文本绘制,流程如下

  1、创建BufferImage对象

  2、获取Graphic2d对象,操作绘制

  3、设置基本配置信息

  4、文本按换行进行拆分为字符串数组, 循环绘制单行内容

  1)计算当行字符串,实际绘制的行数,然后进行拆分

  2)依次绘制文本(需要注意y坐标的变化)

  内容渲染

  前面只是给出了单块内容(如一段文字,一张图片)的渲染,存在一些问题如:绘制的内容超过画布的高度如何处理?

  1)文本绘制要求传入的文本没有换行符,否则换行不生效

  2)交叉绘制的场景,如何重新计算y坐标

  解决这些问题则是在 ImgCreateWrapper 的具体绘制中进行了实现:根据换行符对字符串进行拆分;计算绘制内容终转换为图片时,所占用的高度;重新生成画布 BufferedImage result;如果result为空,则直接生成。如果终生成的高度,超过已有画布的高度,则生成一个高的画布,并将原来的内容绘制上去。需要注意的是画布的生成规则,特别是高度超过上限之后,重新计算图片高度时,需要额外注意新增的高度,应该为基本的增量与(绘制内容高度+下边距)的较大值。

  http接口

  上面实现的生成图片的公共方法,在 quick-media 工程中,利用spring-boot搭建了一个web服务,提供了一个http接口,用于生成长图文,终的成果就是我们开头的那个gif图的效果。

新开班

  • ▪ Python培训班 03.26 抢座
  • ▪ HTML5培训班 03.12 抢座
  • ▪ JavaEE培训班 03.26 抢座
  • ▪ Python培训班 02.26 爆满
  • ▪ JavaEE培训班 01.22 开班
  • ▪ HTML5培训班 12.25 开班
  • ▪ HTML5培训班 11.20 开班
  • ▪ UI交互设计培训 11.20 开班
  • ▪ JavaEE培训班 11.20 开班
  • ▪ HTML5培训班 10.09 爆满
  • 郑州地址:郑州市二七区航海中路60号海为科技园C区10层、12层
    咨询电话:0371-55911950 400-654-7778
    面授课程:iOS课程培训、Android课程培训、HTML5课程培训、UI课程培训
  • 北京天丰利校区:北京市海淀区宝盛北里西区28号天丰利商城4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术广场服务楼2层、南区服务楼2层
    咨询电话:400-654-7778 010-82790226-801
    面授课程:iOS培训、Android培训、HTML5培训、UI培训、PHP培训、JavaEE培训、好程序员
  • 深圳科技园校区:深圳市南山区科苑南路高新技术产业园R3-B栋5层
    深圳大学城校区:深圳市南山区留仙大道1201号大学城创客小镇16栋2楼、3楼
    深圳西部硅谷校区:深圳市宝安区宝安大道5010号西部硅谷B座A605-619
    咨询电话:0755-86681178/9-801
    面授课程:iOS培训、Android培训、HTML5培训、UI培训、PHP培训、JavaEE培训、好程序员
  • 上海地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-627-7899 021-65025129-602
    面授课程:iOS课程培训、Android课程培训、HTML5课程培训、UI课程培训、好程序员
  • 成都旅游校区:成都市一环路西二段17号四川旅游青羊校区内
    成都华立校区:成都一环路西二段17号华立大厦3楼
    咨询电话:028-83178771 028-61967740
    面授课程:iOS课程培训、Android课程培训、HTML5课程培训、UI课程培训
  • 广州地址:广州市天河区元岗路310号智汇park创意园E座5层
    咨询电话:020-22119207 400-654-7778
    面授课程:iOS课程培训、Android课程培训、HTML5课程培训
  • 大连地址:大连市甘井子区软件园路2号B8座二楼
    咨询电话:0411-39026086 400-654-7778
    面授课程:iOS课程培训、Android课程培训、HTML5课程培训
  • 武汉地址:武汉市东新区光谷大道77号金融港B26栋9楼
    咨询电话:027-59905909 027-59905908 027-59905902
    面授课程:iOS课程培训、Android课程培训、HTML5课程培训
  • 西安南二环校区:西安市二环南路西段60号永安大厦4层
    西安科技园校区:西安市雁塔区高新六路52号立人科技园C座西区4层
    咨询电话:029-85260160 029-85261030 029-85260960
    面授课程:iOS课程培训、Android课程培训、HTML5课程培训
  • 杭州地址:浙江省杭州市江干区九堡旺田书画城A座4层
    咨询电话:0571-86893632 010-82790226/7-801
    面授课程:iOS课程培训、Android课程培训
  • 青岛校区地址:青岛市市南区金坛路17号青岛职业技术南校区实训楼A4层
    咨询电话:0532-80910752/3 010-82790226/7-801
    面授课程:iOS课程培训、Android课程培训、UI课程培训
  • 千锋教育微信号
    扫描加好友