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里的JS打印函数
Oct 09 PHP
在Windows版的PHP中使用ADO
Oct 09 PHP
php escape URL编码
Dec 10 PHP
php中$this->含义分析
Nov 29 PHP
php中用数组的方法设置cookies
Apr 21 PHP
php中判断数组是一维,二维,还是多维的解决方法
May 04 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
PHP中substr()与explode()函数用法分析
Nov 24 PHP
php操作mongoDB实例分析
Dec 29 PHP
PHP SPL 被遗落的宝石【SPL应用浅析】
Apr 20 PHP
laravel框架之数据库查出来的对象实现转化为数组
Oct 23 PHP
微信小程序和php的登录实现
Apr 01 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 mssql 时间格式问题
2009/01/13 PHP
php查看请求头信息获取远程图片大小的方法分享
2013/12/25 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
php7 新增功能实例总结
2020/05/25 PHP
PHP的垃圾回收机制代码实例讲解
2021/02/27 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
JavaScript的public、private和privileged模式
2009/12/28 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
javascript中直接写php代码的方法
2013/07/31 Javascript
js setTimeout 参数传递使用介绍
2013/08/13 Javascript
js 显示base64编码的二进制流网页图片
2014/04/04 Javascript
node.js Web应用框架Express入门指南
2014/05/28 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
2014/06/09 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
编写简单的jQuery提示插件
2014/12/21 Javascript
Jquery遍历Json数据的方法
2015/04/20 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
vue中实现先请求数据再渲染dom分享
2018/03/17 Javascript
微信小程序网络请求封装示例
2018/07/24 Javascript
详解如何运行vue项目
2019/04/15 Javascript
vue通过接口直接下载java生成好的Excel表格案例
2020/10/26 Javascript
在Python中利用Pandas库处理大数据的简单介绍
2015/04/07 Python
Python实现的计算器功能示例
2018/04/26 Python
selenium在执行phantomjs的API并获取执行结果的方法
2018/12/17 Python
Python爬虫实现HTTP网络请求多种实现方式
2020/06/19 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
墨西哥网上购物:Linio墨西哥
2016/10/20 全球购物
Supersmart英国:欧洲市场首批食品补充剂供应商之一
2018/05/05 全球购物
应届大学生自荐信格式
2013/09/21 职场文书
思想品德课教学反思
2014/02/10 职场文书
2016年党支部公开承诺书
2016/03/25 职场文书
Python序列化与反序列化相关知识总结
2021/06/08 Python
详解Spring事件发布与监听机制
2021/06/30 Java/Android