女朋友做外贸的,最近需要做个产品册,要求是每张A4纸上有20个图片,我心想小case吧,哥们会点ps呢。可是当她把图片发给俺,俺一看差点吓屎,近10000张图片,这要ps必定吐血身亡。。。
还好俺还会点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"
;
-
}
效果图