Imagemagick
是一个强大的图像处理库,号称命令行上的photoshop
1. 问题场景
在进行手上的一个海报项目时,遇到了这样一个需求:
如图,在用户制作一张海报后,最后保存的时候,图片主体body
是用户制作的海报,footer
是由左右两张二维码组成的,左边为公众号的带参数二维码,右侧是用户自定义的二维码,美工提供一张通用的footer模版,程序来负责动态将二维码替换上去,最终拼接成下面图片示例的样子
2. 为什么使用imagemagick
整个项目后台使用的是PHP语言,既然涉及到图片处理,第一个想到的肯定是大名鼎鼎的GD
库扩展,在使用gd库尝试后,因为性能的原因,可能是我使用的方式不对,合成一张图片的时间长的忍受不了,又果断放弃了,后面又想到使用imagemagick
这个工具,试着使用iamgemagick来重写一遍,果然,速度快了许多
3. 实现思路
a. 将body和footer上下拼接起来
b. 分别将获取的两个二维码图片根据坐标置入左下和右下
注:我觉得先进行b步骤,再拼接,效率可能会高一丢丢,但是我也懒得测了,就没有改动
4. 代码部分
直接使用的是imagemagick的命令行指令,没有使用imagick扩展,已上线稳定使用
public function merge_img($file_name, $ad_file_name, $user_qrcode,$template_id)
{
$body = $file_name;//这个是body的路径
$footer = APPPATH . '../static/img/footer.png';//footer是一张模板图
$qrcode = APPPATH . '../' . $user_qrcode;//右下角用户自定义的二维码
$param_qrcode = $this->param_qrcode($template_id);//左下角的带参数二维码,param_qrcode()方法返回其路径
$cmd = 'convert -append '.$header.' '.$footer.' '.$ad_file_name.'';//1.将body和footer拼接,因为body和footer是固定等宽的,所以直接拼接,+append为横向拼接,-append为纵向拼接
$result = exec($cmd);//执行
$cmd = 'composite -geometry +634+1093 '.$qrcode.' '.$ad_file_name.' '.$ad_file_name.'';//将用户二维码置入右下角,'+634+1093'为置入位置的坐标
$result = exec($cmd);
$cmd = 'composite -geometry +27+1093 '.$param_qrcode.' '.$ad_file_name.' '.$ad_file_name.'';//将带参数二维码置入左下角
$result = exec($cmd);
}