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 相关文章推荐
用PHP实现维护文件代码
Jun 14 PHP
PHP字符串长度计算 - strlen()函数使用介绍
Oct 15 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
PHP调用VC编写的COM组件实例
Mar 29 PHP
PHP捕获Fatal error错误的方法
Jun 11 PHP
解决cPanel无法安装php5.2.17
Jun 22 PHP
php获取url参数方法总结
Nov 13 PHP
smarty内置函数foreach用法实例
Jan 22 PHP
php基本函数汇总
Jul 09 PHP
CodeIgniter集成smarty的方法详解
May 26 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
CodeIgniter框架钩子机制实现方法【hooks类】
Aug 21 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
一个目录遍历函数
2006/10/09 PHP
Search Engine Friendly的URL设计
2006/10/09 PHP
php创建sprite
2014/02/11 PHP
浅谈PHP中其他类型转化为Bool类型
2016/03/28 PHP
JavaScript 指导方针
2007/04/05 Javascript
Javascript 复制数组实现代码
2009/11/26 Javascript
js+css实现增加表单可用性之提示文字
2013/06/03 Javascript
jquery对ajax的支持介绍
2013/12/10 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
weex里Vuex state使用storage持久化详解
2017/09/09 Javascript
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
详解微信小程序获取当前时间及日期的方法
2019/04/28 Javascript
ajax跨域访问遇到的问题及解决方案
2019/05/23 Javascript
js实现图片跟随鼠标移动效果
2019/10/16 Javascript
微信小程序中target和currentTarget的区别小结
2020/11/06 Javascript
解决element-ui的下拉框有值却无法选中的情况
2020/11/07 Javascript
python中Flask框架简单入门实例
2015/03/21 Python
PyQt5每天必学之关闭窗口
2018/04/19 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
python多行字符串拼接使用小括号的方法
2020/03/19 Python
python读文件的步骤
2019/10/08 Python
python框架django项目部署相关知识详解
2019/11/04 Python
sklearn-SVC实现与类参数详解
2019/12/10 Python
Tensorflow tf.dynamic_partition矩阵拆分示例(Python3)
2020/02/07 Python
Python使用tkinter实现小时钟效果
2021/02/22 Python
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
原装进口全世界:天猫国际
2016/08/03 全球购物
Infababy英国:婴儿推车、Travel System婴儿车和婴儿汽车座椅销售
2018/05/23 全球购物
北京RT科技有限公司.net工程师面试题
2013/02/15 面试题
音乐教学随笔感言
2014/02/19 职场文书
2014年三八妇女节活动方案
2014/02/28 职场文书
优秀共产党员事迹材料
2014/12/18 职场文书
本溪水洞导游词
2015/02/11 职场文书
2015驻村干部工作总结
2015/04/07 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
vue-router中hash模式与history模式的区别
2021/06/23 Vue.js