要用 PHP 自动创建一个图片的缩图,做法十分简单,因为 PHP 已内建了相关函式。本文将会介绍制作缩图的巨体做法。 (Web Server 需要 GD 支援)
imagecopyresized
PHP 已经内建了制作缩图的函式,它是 imagecopyresized,以下是 imagecopyresized 的语法:
int imagecopyresized ( resource dst_image, resource src_image, int dst_x, int dst_y, int src_x, int src_y, int dst_w, int dst_h, int src_w, int src_h )
dst_image — 输出目标档案
src_image — 来源档案
dst_x — 目标档案开始点的 x 座标
dst_y — 目标档案开始点的 y 座标
src_x — 来源档案开始点的 x 座标
src_y — 来源档案开始点的 y 座标
dst_w — 目标档案的长度
dst_h — 目标档案的高度
src_w — 来源档案的长度
src_h — 来源档案的高度
例如上传的档案是 $_FILES[‘pic’],而它是属于 jpeg 图案,缩图的长及高不大于 100,那么实作方法如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?php $src = imagecreatefromjpeg($_FILES['pic']['tmp_name']); // get the source image's widht and hight $src_w = imagesx($src); $src_h = imagesy($src); // assign thumbnail's widht and hight if ($src_w > $src_h) { $thumb_w = 100; $thumb_h = intval($src_h / $src_w * 100); } else { $thumb_h = 100; $thumb_w = intval($src_w / $src_h * 100); } // if you are using GD 1.6.x, please use imagecreate() $thumb = imagecreatetruecolor($thumb_w, $thumb_h); // start resize imagecopyresized($thumb, $src, 0, 0, 0, 0, $thumb_w, $thumb_h, $src_w, $src_h); // save thumbnail imagejpeg($thumb, "/var/www/html/uploads/thumb/".$_FILES['pic']['name']); ?> |
以上的程式大致上是先取得 $_FILES[‘pic’] 图档的长度及高度,然后再计算出缩图的相应长度及高度,制作好缩图后,最后将缩图储存到 /var/www/html/uploads/thumb/ 目录下。
高精度图片的质量以上制作缩图的方法在处理一般图档是没有问题,但当要处理的是高精度图片,那么造出的缩图会很难看,与绘图软件造出的缩图有很大程度上的分别,要解决这个问题,可以使用在 php.net 上用户贴出的一个函式,这个函式可以解决高精度图片的问题,但换来的代价是处理的时间较慢:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php function ImageResize (&$src, $x, $y) { $dst=imagecreatetruecolor($x, $y); $pals=ImageColorsTotal ($src); for ($i=0; $i<$pals; $i++) { $colors=ImageColorsForIndex ($src, $i); ImageColorAllocate ($dst, $colors['red'], $colors['green'], $colors['blue']); } $scX =(imagesx ($src)-1)/$x; $scY =(imagesy ($src)-1)/$y; $scX2 =intval($scX/2); $scY2 =intval($scY/2); for ($j = 0; $j < ($y); $j++) { $sY = intval($j * $scY); $y13 = $sY + $scY2; for ($i = 0; $i < ($x); $i++) { $sX = intval($i * $scX); $x34 = $sX + $scX2; $c1 = ImageColorsForIndex ($src, ImageColorAt ($src, $sX, $y13)); $c2 = ImageColorsForIndex ($src, ImageColorAt ($src, $sX, $sY)); $c3 = ImageColorsForIndex ($src, ImageColorAt ($src, $x34, $y13)); $c4 = ImageColorsForIndex ($src, ImageColorAt ($src, $x34, $sY)); $r = ($c1['red']+$c2['red']+$c3['red']+$c4['red'])/4; $g = ($c1['green']+$c2['green']+$c3['green']+$c4['green'])/4; $b = ($c1['blue']+$c2['blue']+$c3['blue']+$c4['blue'])/4; ImageSetPixel ($dst, $i, $j, ImageColorClosest ($dst, $r, $g, $b)); } } return ($dst); } ?> |
以上函式的用法相档简单,$src 是来源档案,$x 是缩图的长度,$y 是缩图的高度,回传的是缩图。
而在 PHP 中除了使用 GD 外,还可以用 ImageMagick 来做,而 ImageMagick 日后有机会再作介绍。