PHP使用imagick扩展实现合并图像的方法


Posted in PHP onApril 25, 2017

本文实例讲述了PHP使用imagick扩展实现合并图像的方法。分享给大家供大家参考,具体如下:

女朋友做外贸的,最近需要做个产品册,要求是每张A4纸上有20个图片,我心想小case吧,哥们会点ps呢。可是当她把图片发给俺,俺一看差点吓屎,近10000张图片,这要ps必定吐血身亡。。。

还好俺还会点php,好吧,写个小程序来完成拼图。因为图片都是按编号排列的,要求给每个图片都加上编号,于是我的思路是:1.先把所有图片缩放到统一尺寸 2.把每张图片和编号组合到一张图 3.把每20张图再组合到一张图。图片处理用到了ImageMagick和php的imagick扩展。下面上代码,有详细注释:

第一步:

// step1: 调整尺寸到 590 x 590
$a = ROOT . '/' . 'a';
// 扫描目录
$dirA = scandir($a);
$im = new Imagick;
foreach ($dirA as $item) {
// 跳过目录和缩略图
if ($item === '.' || $item === '..' || strstr($item, '.db')) {
continue;
}
// 读取图片
$im->readImage($a . '/' . $item);
// 获取图片宽x高
$geo = $im->getImageGeometry();
if ($geo['width'] === 590 && $geo['height'] === 590) {
// 宽高符合,跳过
} else {
// 调整尺寸到590 x 590
im->resizeImage(590, 590, Gmagick::FILTER_UNDEFINED, 1, TRUE);
}
// 将图片保存到另一目录
$im->writeImage(ROOT . '/_a/' . $item);
// 释放资源
$im->destroy();
}

第二步:

// step2: 合并图片和名字
// 扫描目录
$files = scandir(ROOT . '/_a');
$k = 0;
foreach ($files as $item) {
// 跳过目录和缩略图
if ($item === '.' || $item === '..' || strstr($item, '.db')) {
continue;
}
// 文本图片的宽
$twidth = 570;
// 文本图片的高
$theight = 141;
// 获取图片名
$pathinfo = pathinfo($item);
$filename = $pathinfo['filename'];
// 初始化图片对象
$text = new Imagick;
// 初始化绘制对象
$draw = new ImagickDraw;
// 设置字体,这里是放到网站的font下的微软雅黑
$draw->setFont('font/msyh.ttf');
// 文字大小
$draw->setFontSize(40);
// 文字颜色
$draw->setFillColor(new ImagickPixel('#000000'));
// 文字对齐方式
$draw->setTextAlignment(Imagick::ALIGN_LEFT);
// 获取文字信息,主要是长宽,因为要实现在图片居中
$a = $text->queryFontMetrics($draw, $filename);
// 添加文字
$draw->annotation(($twidth - $a['textWidth']) / 2, 80, $filename);
// 建立图像
$text->newImage($twidth, $theight, new ImagickPixel('#ffffff'));
// 图片格式
$text->setImageFormat('png');
// 绘制图片
$text->drawImage($draw);
// 新建一个空白图片用来做画布
$canvas = new Imagick;
$canvas->newimage(570, 661, 'white');
$canvas->setImageFormat('png');
// 读取图片
$pic = new Imagick;
$pic->readImage(ROOT . '/_a/' . $item);
$pic->scaleimage(470, 470, TRUE);
// 将图片合并到画布
$canvas->compositeImage($pic, Imagick::COMPOSITE_OVER, 50, 50);
// 将文字合并到画布
$canvas->compositeimage($text, Imagick::COMPOSITE_OVER, 0, 520);
// 保存图片到另一目录
$canvas->writeimage(ROOT . '/com_a/' . $item);
$k++;
echo "{$k} files proceeded.\n";
}

效果图

PHP使用imagick扩展实现合并图像的方法

第三步:

// step3: 合并每20张到一页
// 扫描目录
$files = scandir(ROOT . '/com_a');
// 给图片分组
$i = $j = 0;
$group = array();
foreach ($files as $item) {
  if ($item === '.' || $item === '..' || strstr($item, '.db')) {
    continue;
  }
  $i++;
  $group[$j][] = $item;
  if ($i % 20 === 0) {
    $j++;
  }
}
$total = count($group);
// 按组拼接图片,A4纸尺寸,4x5的组合方式
foreach ($group as $k => $v) {
  $canvas = new Imagick;
  $canvas->newimage(2480, 3508, 'white');
  $canvas->setimageformat('png');
  $i = $j = 0;
  foreach ($v as $item) {
    $im = new Imagick(ROOT . '/com_a/' . $item);
    // 预留了150的左边距
    $x = 150 + $i * 570;
    // 130的顶边距
    $y = 130 + $j * 661;
    $canvas->compositeimage($im, Imagick::COMPOSITE_OVER, $x, $y);
    // 每4张一行
    if (($i + 1) % 4 === 0) {
      $i = 0;
      $j++;
    } else {
      $i++;
    }
  }
  $canvas->writeimage(ROOT . '/merge_a/' . $k . '.png');
  $c = $k + 1;
  echo "Group {$c}/{$total} done.\n";
}

效果图

PHP使用imagick扩展实现合并图像的方法

PHP 相关文章推荐
基于mysql的bbs设计(一)
Oct 09 PHP
php xml-rpc远程调用
Dec 19 PHP
dedecms系统的广告设置代码 基础版本
Apr 09 PHP
深入理解:单一入口、MVC、ORM、CURD、ActiveRecord概念
Jun 06 PHP
利用php下载xls文件(自己动手写的)
Apr 18 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
Jul 01 PHP
在CentOS系统上从零开始搭建WordPress博客的全流程记录
Apr 21 PHP
PHP MYSQL简易交互式站点开发
Dec 27 PHP
PHP封装返回Ajax字符串和JSON数组的方法
Feb 17 PHP
Yii2框架自定义验证规则操作示例
Feb 08 PHP
phpstorm 配置xdebug的示例代码
Mar 31 PHP
PHP实现十进制、二进制、八进制和十六进制转换相关函数用法分析
Apr 25 #PHP
php读取XML的常见方法实例总结
Apr 25 #PHP
利用PHP实现一个简单的用户登记表示例
Apr 25 #PHP
PHP中的正则表达式实例详解
Apr 25 #PHP
PHP利用二叉堆实现TopK-算法的方法详解
Apr 24 #PHP
关于PHP定时发送服务的解决办法
Apr 23 #PHP
php读取和保存base64编码的图片内容
Apr 22 #PHP
You might like
PHP网站建设的流程与步骤分享
2015/09/25 PHP
浅谈PHP中new self()和new static()的区别
2017/08/11 PHP
使用正则替换变量
2007/05/05 Javascript
javascript hashtable 修正版 下载
2010/12/30 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
AngularJS中$watch和$timeout的使用示例
2016/09/20 Javascript
12 款 JS 代码测试必备工具(翻译)
2016/12/13 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
vue使用drag与drop实现拖拽的示例代码
2017/09/07 Javascript
Windows下Node.js安装及环境配置方法
2017/09/18 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
babel的使用及安装配置教程
2018/02/22 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
JavaScript解析机制与闭包原理实例详解
2019/03/08 Javascript
vue计算属性无法监听到数组内部变化的解决方案
2019/11/06 Javascript
Python实现Linux中的du命令
2017/06/12 Python
windows 下python+numpy安装实用教程
2017/12/23 Python
python使用xlrd和xlwt读写Excel文件的实例代码
2018/09/05 Python
python根据时间获取周数代码实例
2019/09/30 Python
NumPy中的维度Axis详解
2019/11/26 Python
Python字符串中删除特定字符的方法
2020/01/15 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
python名片管理系统开发
2020/06/18 Python
python中return如何写
2020/06/18 Python
在加拿大在线租赁和购买电子游戏:Game Access
2019/09/02 全球购物
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
PHP如何防止SQL注入
2014/05/03 面试题
北京鼎普科技股份有限公司软件测试面试题
2012/04/07 面试题
初中生自我鉴定
2014/02/04 职场文书
敬老院献爱心活动总结
2014/07/08 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
运动会加油稿30字
2015/07/21 职场文书
python 如何获取页面所有a标签下href的值
2021/05/06 Python
使用ORM新增数据在Mysql中的操作步骤
2021/07/26 MySQL
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL