php创建并处理图象
在安装了一些第三方函数库之后,结合图形处理技能,你就可以迅速使用PHP创建和处理图像了。事实上,你也不需要很多几何学知识——因为我在中学的时候这门功课曾经不及格而现在却能使用PHP创建图像! 9 D k+ {& C$ L& N
; T- K) Z( q! K; ]$ }: W
0 w! \9 O) W% H) {, x: g! U/ l# Y- j" [
在使用基本的图像创建函数之前,需要安装GD库。要使用JPEG相关的图像创建函数还需要安装jpeg-6b。在图像中使用Type 1字体的时候还必须安装t1lib。
3 i# |7 I7 }1 @0 M: m1 m% I$ V$ J% n/ w" ?
在这里,你还需要对你的系统设置进行进一步地调整。首先安装t1lib并结束,然后是jpeg-6b。第三步安装GD函数库。确保以上三部分按顺序安装,原因是你需要编译GD库才能使用jpeg-6b库。如果首先安装jpeg-6b,编译就会出错,这会让你不知所措够上一段时间。 5 B2 z1 l* S$ ^& r! r' a: T
( z) K a/ ]8 k* C& g5 h; |& p$ a在三函数库之后,重新配置PHP。这是在轻松安装PHP的DSO版本时的典型方法。然后执行make clean,命令,并在当前配置提示中加入以下代码: ) f3 l ~5 A0 F+ H) y* X
8 h% k; H9 }, x. R& i
--with-gd=[/path/to/gd]
# p( X0 K! z: `% i$ k8 T) h
. H3 S m0 E! k+ k S- C--with-jpeg-dir=[/path/to/jpeg-6b] ( o: D2 M% u: P l- V6 T
: [4 P3 v4 c. T8 {" d3 q
--with-t1lib=[/path/to/t1lib] + N* a/ @) H d
0 T9 d* M% h. p
最后执行make、make install完成配置。重新启动 Apache,并运行phpinfo()函数以检查新功能是否正常运行,然后就可以开始了。 6 E: p; z$ E& Z2 d9 A+ J" v
- K4 s0 a8 [( X/ ]& V
取决于安装的GD库版本,你可能具有创建GIF或者PNG图像的能力。关键是如果你已经安装了gd-1.6或者早期版本,则可处理GIF文件,但不能处理PNG文件;如果安装了gd-1.6或者以后版本,你可以处理PNG文件却又不能处理GIF文件。
4 A; H l. L$ T9 t; Q3 _, f
, Y2 R* M) k! q$ [7 [创建一个简单的图像需要几个函数。我将按步骤演示如下。
# [3 D6 b1 u+ t3 ]) s1 r
* R, _; X- r# f, S4 N B7 k- e输出包含你所创建图像MIME类型的文件头,本例中为PNG。 ( T, x) d/ N; ?% N/ W$ A! ^& [
7 x! A$ y& ?" J9 ^& ^<? header ("Content-type: image/png"); 9 Y6 C, n% A2 U4 C6 L
6 V# H0 O; F* j/ ]% M1 r使用ImageCreate()创建一变量存放空白图像。该函数需要一个图片像素尺寸。格式为ImageCreate(x_size, y_size),对250*250像素的图片,如下: & ` P) J% L; i- v V
" _. f- r, G, j: Y* J, |$newImg = ImageCreate(250,250);
, ], R+ U) j; K1 Q# a x) F M4 v/ N$ ^5 ^7 w4 L& o
由于此时你的图像还是空白,所以需要用某些色彩填满它。但首先需要用ImageColorAllocate()函数按照颜色的RGB值为每种颜色确定名字。函数的格式为ImageColorAllocate([image], [red], [green], [blue])。如是天蓝色,应使用:
0 s5 x/ i( ]; l
( e5 m7 D& f1 U; C) S: m$skyblue = ImageColorAllocate($newImg,136,193,255);
) J2 v7 v: O, o. `3 k& k4 ^9 G- c) |. z% l$ p8 O, \. E2 A. d" ?, W
5 h+ N3 J1 e% k. C
) H6 w( K1 O. P4 u! k1 c4 |
接着,用ImageFill()函数为图像填充以上颜色。实际上ImageFill()函数有多个版本,如ImageFillRectangle(), ImageFillPolygon()等等。为简单起见,采用ImageFill()函数进行颜色填充,格式如下: u0 D* y, q$ D' y6 @/ ?0 s4 W8 q, I: m
: q( x+ S0 y$ q7 H/ x. hImageFill([image], [start x point], [start y point], [color])
5 N' e8 k9 d5 {/ O# F) d1 P4 T+ A, c5 T% }- b$ l, C
ImageFill($newImg,0,0,$skyblue); 7 w& b- G' @. S$ n; u# W6 O2 |
4 @$ T0 @# k2 z1 D7 X0 H C
最后,创建最终图像并破坏图像流以释放内存并在结束后整理系统:
* t3 T6 y0 ]3 _3 M* J8 |
- t5 Y/ g% f+ W# K- EImagePNG($newImg);
+ `7 z9 f/ ^, e0 A- B* [: c6 P: U+ X* ^7 W$ R0 P! x3 ~; L4 S
ImageDestroy($newImg); ?>
* K" }/ Z9 [ |% a
' c/ B U5 i4 j) O& j你的代码应该看起来像这样: % U6 b% G% }% _& m/ ]/ b+ v; K: J
: u, N; a+ O6 V' _<? header ("Content-type: image/png");
6 w" N! L% J O8 b( j( {: M2 N& m5 { L) i5 ?( E
$newImg = ImageCreate(250,250);
7 q* r! Z# W% b }, A, {& O
. }- @1 M& x3 J( T/ m1 z$skyblue = ImageColorAllocate($newImg,136,193,255); + V* \' e: X4 _% J) S$ ?
( d9 j7 g6 f# {( f% ]" q# h
ImageFill($newImg,0,0,$skyblue);
/ U. K) U M3 ]6 v8 }; L: `
+ ~, q" ~$ [! f4 _/ t5 [* HImagePNG($newImg); - S( |7 Y) M }# _& l; K$ e8 S6 J
# j1 [* C' X" N8 T0 k- t8 V: J
ImageDestroy($newImg); 6 J- ?4 Z( [- D0 b
, i0 W, N& v; l3 y?> 9 m7 [4 K$ {$ U* ^0 W) l
5 g" z! P6 z- s2 d' ]0 { V) @如果调用脚本skyblue.php 并用自己的浏览器访问它,就会看到一个250*250像素的蓝色PNG图像。 l( @; N, ?3 g& E2 w
8 ^9 g" Q4 X3 Y+ N还可以用图像创建函数处理图像,如对大图像创建的缩略图等。 / D6 L5 _2 i, T1 A& W1 P
: E9 J9 `* n9 I. v) g; n( P. ]7 N# d
假设你打算为某图片制作一个35*35像素大小的缩略图。所要做的即创建一个新的35*35像素大小图像;并产生一个包含原始图像内容的图像流;然后改变原始图像的大小,并将其放到新的空白图像中去。 3 |1 N3 l- A) e: [. x
9 |1 t4 G# ~$ O& m- R2 X6 `" \$ F. z达到此目的的关键函数是ImageCopyResized(),,格式如下所示:ImageCopyResized([new image handle],[original image handle],[new image X],[new Image Y],[original image X],[original image Y], [new image X], [new image Y],[original image X],[original image Y]);
# p: ?; H3 g% Y+ k9 C" C, W% n% N# C$ q1 a3 ?4 l) M; R
注释在代码下面: 5 w! d: z$ a5 a/ |+ ?5 s% P
, e' t% S. |+ t/ b2 p
<? /* 发送文件头以使浏览器知道文件类型*/
- M! N( x4 |& v2 p4 k
) |+ p" \6 d! X7 m* A6 gheader("Content-type: image/png");
; v* W I- }. S# Y2 U2 c. V5 v) z2 x# E' p2 G) `
/* 设置变量保存新图片长宽*/
) l( o5 w k* m" b1 s
0 D$ j1 K0 b; A$newWidth = 35; 0 k3 u. r2 u# Z# D4 G. }
: ^& ~ u! Z% f% b Q7 I$newHeight = 35;
) K. ~3 u$ n L* x l. b" b7 W
% t/ B5 L' K4 f+ f/* 以给定长和宽创建空白新图片 */
6 ~" P2 d9 X+ p8 p2 A" ?) w
# w8 ~/ |$ h& X3 S$newImg = ImageCreate($newWidth,$newHeight); 9 ^" d: ?' E' w& R
/ C" ]# }5 p- d' i2 C
/* 从原始大图获取数据 */ - ?! y. G5 L! e; ]( {! o! ?* g6 y/ |/ z
. b0 d$ Y* B* t* h4 X6 K1 R$origImg = ImageCreateFromPNG("test.png"); 5 T0 ^) `+ Z- ~! L; J' p, U
# u: f x2 F6 a2 @( Z, m, k
/* 复制更改尺寸后的图片。使用函数 ImageSX() 及 ImageSY 获取原始图片的x及x尺寸 */
* \% g( B+ o: r) d1 S" t! l$ J
ImageCopyResized($newImg,$origImg,0,0,0,0,$newWidth,$newHeight,ImageSX($origImg),ImageSY($origImg)); : P$ c5 q0 h/ l1 f
7 _; e9 j: \) f: s" ?
/* 创建最终图片并清空内存 */
+ b( ~) n0 ^0 t$ w
% n* h6 w& P5 I& eImagePNG($newImg); & o# Y# f# Y* g7 r; b
: a" A0 t: O) j3 O+ X4 U- a
ImageDestroy($newImg); ?>
0 D M: k0 k5 F
8 X2 u) C, c# }! ?如果调用脚本resized.php并使用浏览器访问此文件,可以看到一个35*35像素的缩略PNG图片。