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
《APMServ 5.1.2》使用图解
Oct 23 PHP
PHP中的类-什么叫类
Nov 20 PHP
php select,radio和checkbox默认选择的实现方法
May 15 PHP
php设计模式之单例、多例设计模式的应用分析
Jun 30 PHP
php之curl实现http与https请求的方法
Oct 21 PHP
浅谈使用PHP开发微信支付的流程
Oct 04 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
Dec 21 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
Apr 27 PHP
laravel框架添加数据,显示数据,返回成功值的方法
Oct 11 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
Dec 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
PHP5在Apache下的两种模式的安装
2006/09/05 PHP
PHP4.04简明安装
2006/10/09 PHP
php中运用http调用的GET和POST方法示例
2014/09/29 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
2015/11/27 PHP
thinkPHP实现递归循环栏目并按照树形结构无限极输出的方法
2016/05/19 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
PHP http请求超时问题解决方案
2020/11/13 PHP
Javascript----文件操作
2007/01/18 Javascript
jquery 弹出层注册页面等(asp.net后台)
2010/06/17 Javascript
原生js拖拽(第一课 未兼容)拖拽思路
2013/03/29 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
深入理解JQuery循环绑定事件
2016/06/02 Javascript
微信小程序 教程之模板
2016/10/18 Javascript
JS正则表达式修饰符中multiline(/m)用法分析
2016/12/27 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
JavaScript数据结构之二叉树的查找算法示例
2017/04/13 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
Laravel admin实现消息提醒、播放音频功能
2019/07/10 Javascript
layui+SSM的数据表的增删改实例(利用弹框添加、修改)
2019/09/27 Javascript
javascript设计模式 ? 迭代器模式原理与用法实例分析
2020/04/17 Javascript
基于VSCode调试网页JavaScript代码过程详解
2020/07/20 Javascript
Python最基本的输入输出详解
2015/04/25 Python
Python实现屏幕截图的代码及函数详解
2016/10/01 Python
python可视化实现KNN算法
2019/10/16 Python
你可能不熟练的十个前端HTML5经典面试题
2018/07/03 HTML / CSS
HTML5中的拖放实现详解
2017/08/23 HTML / CSS
培训讲师邀请函
2014/01/10 职场文书
新学期教师寄语
2014/04/02 职场文书
《恐龙》教学反思
2014/04/27 职场文书
实习推荐信
2014/05/10 职场文书
python中if和elif的区别介绍
2021/11/07 Python
Golang 对es的操作实例
2022/04/20 Golang