php 扩展了imagick,PHP编程:PHP使用imagick扩展实现合并图像的方法
《PHP使用imagick扩展实现合并图像的方法》要点:
本文介绍了PHP使用imagick扩展实现合并图像的方法,希望对您有用。如果有疑问,可以联系我们。
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,520);
// 保存图片到另一目录
$canvas->writeimage(ROOT . '/com_a/' . $item);
$k++;
echo "{$k} files proceeded.\n";
}
第三步:
// 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,$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";
}
PS:这里再为大家推荐几款比较实用的图片处理工具供大家参考使用:
在线图片转换BASE64工具:@H_403_89@http://tools.jb51.net/transcoding/img2base64
ICO图标在线生成工具:@H_403_89@http://tools.jb51.net/aideddesign/ico_img
在线Email邮箱图标制作工具:@H_403_89@http://tools.jb51.net/email/emaillogo
在线图片格式转换(jpg/bmp/gif/png)工具:@H_403_89@http://tools.jb51.net/aideddesign/picext
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP面向对象程序设计入门教程》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《PHP字符串(string)用法总结》、《PHP+MysqL数据库操作入门教程》及《PHP常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助.
总结
如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
php 扩展了imagick,PHP编程:PHP使用imagick扩展实现合并图像的方法相关推荐
- php 获取网络图片合成,PHP使用imagick扩展实现合并图像的方法
本文实例讲述了PHP使用imagick扩展实现合并图像的方法.分享给大家供大家参考,具体如下: 女朋友做外贸的,最近需要做个产品册,要求是每张A4纸上有20个图片,我心想小case吧,哥们会点ps呢. ...
- php imagick 扩展,PHP使用imagick扩展实现合并图像的方法详解
这篇文章主要介绍了PHP使用imagick扩展实现合并图像的方法,结合实例形式分析了php基于imagick扩展处理图片的具体步骤与相关操作技巧,需要的朋友可以参考下 第一步: // step1: 调 ...
- JAVA 代码交互率低的原因分析,深入剖析Java编程中的中文问题及建议最优解决方法...
说明:本文为作者原创,作者联系地址为: josserchai@yahoo.com .由于 Java 编程中的中文 问题是一个老生常谈的问题,在阅读了许多关于 Java 中文问题解决方法之后,结合作者的 ...
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录
- android 图片绑定按钮,Android编程实现给Button添加图片和文字的方法
本文实例讲述了Android编程实现给Button添加图片和文字的方法.分享给大家供大家参考,具体如下: //为按钮添加图片和文字的方法 public Spanned getSpan(int id, ...
- 嵌入式编程C语言提高代码效率的14种方法
嵌入式编程C语言提高代码效率的14种方法 1.在可能的情况下使用typedef替代define.当然有时候你无法避免define,但是typedef更好. typedef int* INT_PTR; ...
- java定义一个类计算圆的半径,C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计...
导航:网站首页 > C++编程:定义一个圆类要求属性为半径,操作为计算圆的周长和面积...,java编程:定义一个圆类,属性为半径,方法为对输入的半径计 C++编程:定义一个圆类要求属性为半径, ...
- php+imagick详解,PHP中imagick函数的中文解释_php技巧
imagick的:: adaptiveBlurImage - 增加了自适应模糊滤镜图像 imagick的:: adaptiveResizeImage - 自适应调整图像数据依赖三角 imagick的: ...
- Java编程:Java的反射机制中的 getComponentType() 方法
转载自 Java编程:Java的反射机制中的 getComponentType() 方法 Java 中所有的类都继承自 Object,数组本身也是一个 Class,如果我们能够得到数据的 Class ...
最新文章
- 面试官:磁盘 IO 变高,你怎么分析?
- 以太经典(ETC)逆势上涨,将逆袭反超以太坊(ETH)?
- ESP8266 wifi干扰、钓鱼实现
- 【经典回放】多种语言系列数据结构算法:希尔排序
- 从小害怕数学的他,却成为了科普数学教育的数学家
- c++ 读文件_第十六节:读文件,文件的创建,写文件,文件的读写以及鼠标键盘事件和图形绘制...
- 技术员联盟win11系统64位专业版镜像v2021.08
- 那是飞扬的青春—小评《DOOM启示录》
- linux优化安装包,安装Xshell跟Linux相连并优化(付安装包)
- Unity3d trial version 水印
- Netty websocket 推送数据压缩以 js解压
- 每个广告组放多少个关键字合适?
- 变限积分求导公式总结_积分变限函数求导的基本方法
- JavaCC中扩展的正规表达式
- 透明代理、匿名代理、混淆代理、高匿代理有什么区别?
- 树莓派与ESP8266-MQTT无线通信
- Nvjdc(诺兰)再续经典——诺兰方舟ARK
- Java官方教程(三-1)运算符 operator(2020.12.18)
- 红警ol服务器维护中1003,【图片】红警ol心灵终结3单位全面解析_红警ol吧_百度贴吧...
- 在MySQL中创建视图的X种方式