image-combiner合成图片

项目背景

在XXX智能交警项目中为了获取入围和宇视竞标的资格,需要完成用户的六张图片合成一张的需求并且展示合成的效果给用户看证明海康有这个能力去竞争这个项目。

项目需求

用户主要的需求是在路口的抓拍杠上安装一正一反两台抓拍机,正向卡口抓拍车辆的一张正面照片以及车牌号照片,反向卡口抓拍车辆反向发生违法行为时的3张照片以及车牌号照片,合成六合一的一张大图,左边反卡口抓拍到的四张是3张违法图片和违法抓拍的车牌图片,右边两张是正卡口抓拍到的正常过车和车牌号的图片。下面是用户提供的示例图

技术选型

合成图片的工具网络上有很多,也有许多可参考的代码案例以及实现思路。但鉴于项目周期比较短,为不影响后面的竞标以及给用户的印象,决定使用网络上比较成熟的开源工具image-combiner去实现这个功能。ImageCombiner是一个专门用于Java服务端图片合成的工具,没有很复杂的功能,简单实用,从实际业务场景出发,提供简单的接口,几行代码即可实现图片拼合(当然用于合成水印也可以),素材上支持图片、文本、矩形三种,支持定位、缩放、旋转、圆角、透明度、颜色、字体、字号、删除线、居中绘制、文本自动换行等特性,足够覆盖图片合成的日常需求。

ImageCombiner使用方法

ImageCombiner使用起来相当简单,主要的类只用一个:

1、new一个ImageCombiner对象

2、指定背景图片和输出格式,然后加入各种素材元素,设置元素的位置、大小和效果(如圆角、颜色、透明度等)

3、调用combine()方法即可。

备注:combine()方法直接返回BufferedImage对象,也可以调用getCombinedImageStream()获得流,方便上传oss等后续操作,或者调用save()方法保存到本地,调试的时候比较方便。

SDK坐标

<dependency>
        <groupId>com.freewayso</groupId>
        <artifactId>image-combiner</artifactId>
        <version>2.3.6</version>
</dependency>

业务流程

因为反卡口抓拍的是违法过车,正卡口抓拍的是正常过车,两台不同的设备抓拍到的报文信息只能通过车牌号和过车时间进行关联,由于不知道会是违法报文先被消费掉,还是正常过车报文先被消费掉,所以第一张上来的图片和第二张上来的图片处理流程不一样。

合成图片代码

最开始合成的图片大小是按照每张图片的长宽进行合并的,最后拼接铺成一张完整合成图片

合成效果

问题

1、合成耗费时间过长,合成耗费将近21秒(上图的cost time)

2、合成图片的体积太大,同时分辨率也过大

优化

图片的体积大是分辨率过大造成的,通过ImageCombiner的构造函数可以看出,控制ImageCombiner生成画布长宽可以调整最后生成图片的分辨率

更改生成画布的分辨率,每张图片按照特定的比例放倒画布上面

优化之后合成时间缩短了7倍,生成图片减体积到2M以内

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值