本文通过一个实例对比Imagick和Gmagick的像素迭代功能:
像素数据生成代码
<?php
$data = array();
for ($row = 0; $row < 100; $row++) {
for ($column = 0; $column < 100; $column++) {
$data[$row][$column] = '#' . str_repeat($column % 10, 6);
}
}
?>
Imagick迭代写像素
<?php
require 'data.php';
$image = new Imagick();
$image->newimage(100, 100, 'white', 'png');
$iterator = $image->getPixelIterator();
foreach ($iterator as $row => $pixels) {
foreach ($pixels as $column => $pixel) {
$pixel->setColor($data[$row][$column]);
}
$iterator->syncIterator();
}
$image->writeimage('pixel.png');
?>
注:在Imagick中利用PixelIterator写像素时,需要调用syncIterator操作(读像素不用)。
Gmagick迭代写像素
<?php
require 'data.php';
$image = new Gmagick();
$image->newimage(100, 100, 'white', 'png');
$pixel = new GmagickPixel();
$draw = new GmagickDraw();
for ($row = 0; $row < 100; $row++) {
for ($column = 0; $column < 100; $column++) {
$pixel->setcolor($data[$row][$column]);
$draw->setfillcolor($pixel);
$draw->point($column, $row);
$image->drawimage($draw);
$pixel->clear();
$draw->clear();
}
}
$image->writeimage('pixel.png');
?>
好俺还会点PHP,好吧,写个小程序来完成拼图。因为图片都是按编号排列的,要求给每个图片都加上编号,于是我的思路是:1.先把所有图片缩放到统一尺寸 2.把每张图片和编号组合到一张图 3.把每20张图再组合到一张图。图片处理用到了ImageMagick和php的imagick扩展。下面上代码,有详细注释:
第一步:
-
// step1: 调整尺寸到 590 x 590
-
$a = ROOT . '/' . 'a' ;
-
// 扫描目录
-
$im = new Imagick ;
-
foreach ( $dirA as $item ) {
-
-
// 跳过目录和缩略图
-
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: 合并图片和名字
-
// 扫描目录
-
$k = 0 ;
-
foreach ( $files as $item ) {
-
// 跳过目录和缩略图
-
continue ;
-
}
-
// 文本图片的宽
-
$twidth = 570 ;
-
// 文本图片的高
-
$theight = 141 ;
-
// 获取图片名
-
$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" ;
-
}
效果图
第三步:
-
// step3: 合并每20张到一页
-
// 扫描目录
-
-
-
// 给图片分组
-
$i
=
$j
=
0
;
-
-
foreach
(
$files
as
$item
)
{
-
-
continue
;
-
}
-
$i
++;
-
$group
[
$j
]
[
]
=
$item
;
-
if
(
$i
%
20
===
0
)
{
-
$j
++;
-
}
-
}
-
-
-
// 按组拼接图片,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"
;
-
}
效果图