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 相关文章推荐
第十一节 重载 [11]
Oct 09 PHP
php面向对象全攻略 (三)特殊的引用“$this”的使用
Sep 30 PHP
PHP中的MYSQL常用函数(php下操作数据库必备)
Sep 12 PHP
php中json_decode()和json_encode()的使用方法
Jun 04 PHP
php实现把数组按指定的个数分隔
Feb 17 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
两种php实现图片上传的方法
Jan 22 PHP
为何说PHP引用是个坑,要慎用
Apr 02 PHP
PHP一致性hash分布式算法封装类定义与用法示例
Aug 04 PHP
PHP封装的完整分页类示例
Aug 21 PHP
thinkPHP5.0框架事务处理操作简单示例
Sep 07 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
Apr 04 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
在PHP3中实现SESSION的功能(二)
2006/10/09 PHP
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
定义php常量的详解
2013/06/09 PHP
php通过asort()给关联数组按照值排序的方法
2015/03/18 PHP
Laravel5.1自定义500错误页面示例
2016/10/09 PHP
小程序微信退款功能实现方法详解【基于thinkPHP】
2019/05/05 PHP
JavaScript之HTMLCollection接口代码
2011/04/27 Javascript
JavaScript版TAB选项卡效果实例
2013/08/16 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
JavaScript简单获取页面图片原始尺寸的方法
2016/06/21 Javascript
基于Bootstrap实现的下拉菜单手机端不能选择菜单项的原因附解决办法
2016/07/22 Javascript
jQuery simpleModal插件的使用介绍
2016/08/30 Javascript
JS填写银行卡号每隔4位数字加一个空格
2016/12/19 Javascript
JavaScript、C# URL编码、解码总结
2017/01/21 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
jQuery选择器之表单元素选择器详解
2017/09/19 jQuery
ES6中的Promise代码详解
2017/10/09 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
vue使用Element组件时v-for循环里的表单项验证方法
2018/06/28 Javascript
jQuery 判断元素是否存在然后按需加载内容的实现代码
2020/01/16 jQuery
JavaScript实现多个物体同时运动
2020/03/12 Javascript
构建一个JavaScript插件系统
2020/10/20 Javascript
Python实现端口复用实例代码
2014/07/03 Python
Python的Flask框架中@app.route的用法教程
2015/03/31 Python
Python基于贪心算法解决背包问题示例
2017/11/27 Python
Python利用openpyxl库遍历Sheet的实例
2018/05/03 Python
Python并行分布式框架Celery详解
2018/10/15 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
numpy np.newaxis 的实用分享
2019/11/30 Python
django 读取图片到页面实例
2020/03/27 Python
数字漫画:comiXology
2020/06/13 全球购物
对象的序列化(serialization)类是面向流的,应如何将对象写入到随机存取文件中
2015/06/22 面试题
周一给客户的问候语
2015/11/10 职场文书
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
实操Python爬取觅知网素材图片示例
2021/11/27 Python