使用imagemagick实现两张或多张图片图片拼接 覆盖

Imagemagick是一个强大的图像处理库,号称命令行上的photoshop

  • 使用GD扩展实现和本篇文章相同的效果
  • php的imagick扩展和imagemagick的安装教程
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);
    }

你可能感兴趣的:(使用imagemagick实现两张或多张图片图片拼接 覆盖)