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 静态化实现代码
Mar 20 PHP
PHP 文件缓存的性能测试
Apr 25 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
php为字符串前后添加指定数量字符的方法
May 04 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
PHP生成图片缩略图类示例
Jan 12 PHP
PHP实现将优酷土豆腾讯视频html地址转换成flash swf地址的方法
Aug 04 PHP
PHP实现的回溯算法示例
Aug 15 PHP
利用 fsockopen() 函数开放端口扫描器的实例
Aug 19 PHP
PDO::getAttribute讲解
Jan 28 PHP
PHP远程连接oracle数据库操作实现方法图文详解
Apr 11 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脚本的10个技巧(2)
2006/10/09 PHP
PHP使用SOAP扩展实现WebService的方法
2016/04/01 PHP
PHP连接MySQL进行增、删、改、查操作
2017/02/19 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
JScript 脚本实现文件下载 一般用于下载木马
2009/10/29 Javascript
同域jQuery(跨)iframe操作DOM(实例讲解)
2013/12/19 Javascript
jquery easyui使用心得
2014/07/07 Javascript
jQuery扁平化风格下拉框美化插件FancySelect使用指南
2015/02/10 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
JavaScript中点击事件的写法
2016/06/28 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
vue.js实现只弹一次弹框
2018/01/29 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
ES6知识点整理之Proxy的应用实例详解
2019/04/16 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
jQuery实现简单评论区功能
2020/10/26 jQuery
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
TensorFlow实现简单卷积神经网络
2018/05/24 Python
简单了解python关系(比较)运算符
2019/07/08 Python
Python实现一个带权无回置随机抽选函数的方法
2019/07/24 Python
如何通过python的fabric包完成代码上传部署
2019/07/29 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
Python如何批量生成和调用变量
2020/11/21 Python
次世代生活态度:Hypebeast
2018/07/05 全球购物
医学专业五年以上个人求职信
2013/12/03 职场文书
英文自荐信
2013/12/19 职场文书
医药销售求职信范文
2014/02/01 职场文书
年度考核自我鉴定
2014/02/02 职场文书
党员干部承诺书
2014/03/25 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
群众路线教育实践活动思想汇报(2014特荐篇)
2014/09/16 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
2015上半年个人工作总结
2015/07/27 职场文书
导游词之镜泊湖
2019/12/09 职场文书