PHP 下製作縮圖

文章位置: 主頁 > 文章資料庫 > PHP 教學 > PHP 下製作縮圖
瀏覽次數: 10606
更新時間: 2005/05/25 16:49

簡介

在 "使用 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,那麼實作方法如下:

01 <?php
02 $src 
imagecreatefromjpeg($_FILES['pic']['tmp_name']);
03
// get the source image's widht and hight
04
$src_w imagesx($src);
05
$src_h imagesy($src);
06
07
// assign thumbnail's widht and hight
08
if($src_w $src_h){
09     
$thumb_w 100;
10     
$thumb_h intval($src_h $src_w 100);
11 }else{
12     
$thumb_h 100;
13     
$thumb_w intval($src_w $src_h 100);
14 }
15
16
// if you are using GD 1.6.x, please use imagecreate()
17
$thumb imagecreatetruecolor($thumb_w$thumb_h);
18
19
// start resize
20
imagecopyresized($thumb$src0000$thumb_w$thumb_h$src_w$src_h);
21
22
23
// save thumbnail
24
imagejpeg($thumb"/var/www/html/uploads/thumb/".$_FILES['pic']['name']);
25
?>


以上的程式大致上是先取得 $_FILES['pic'] 圖檔的長度及高度,然後再計算出縮圖的相應長度及高度,製作好縮圖後,最後將縮圖儲存到 /var/www/html/uploads/thumb/ 目錄下。


高精度圖片的質量以上製作縮圖的方法在處理一般圖檔是沒有問題,但當要處理的是高精度圖片,那麼造出的縮圖會很難看,與繪圖軟件造出的縮圖有很大程度上的分別,要解決這個問題,可以使用在 php.net 上用戶貼出的一個函式,這個函式可以解決高精度圖片的問題,但換來的代價是處理的時間較慢:

01 <?php
02
function ImageResize (&$src$x$y) {
03     
$dst=imagecreatetruecolor($x$y);
04     
$pals=ImageColorsTotal ($src);
05
06     for (
$i=0$i<$pals$i++) {
07         
$colors=ImageColorsForIndex ($src$i);
08         
ImageColorAllocate ($dst$colors['red'], $colors['green'], $colors['blue']);
09
10     }
11     
$scX =(imagesx ($src)-1)/$x;
12     
$scY =(imagesy ($src)-1)/$y;
13     
$scX2 =intval($scX/2);
14     
$scY2 =intval($scY/2);
15
16     for (
$j 0$j < ($y); $j++) {
17         
$sY intval($j $scY);
18         
$y13 $sY $scY2;
19         for (
$i 0$i < ($x); $i++) {
20             
$sX intval($i $scX);
21             
$x34 $sX $scX2;
22             
$c1 ImageColorsForIndex ($srcImageColorAt ($src$sX$y13));
23             
$c2 ImageColorsForIndex ($srcImageColorAt ($src$sX$sY));
24             
$c3 ImageColorsForIndex ($srcImageColorAt ($src$x34$y13));
25             
$c4 ImageColorsForIndex ($srcImageColorAt ($src$x34$sY));
26             
$r = ($c1['red']+$c2['red']+$c3['red']+$c4['red'])/4;
27             
$g = ($c1['green']+$c2['green']+$c3['green']+$c4['green'])/4;
28             
$b = ($c1['blue']+$c2['blue']+$c3['blue']+$c4['blue'])/4;
29             
ImageSetPixel ($dst$i$jImageColorClosest ($dst$r$g$b));
30         }
31     }
32     return (
$dst);
33 }
34
?>


以上函式的用法相檔簡單,$src 是來源檔案,$x 是縮圖的長度,$y 是縮圖的高度,回傳的是縮圖。

而在 PHP 中除了使用 GD 外,還可以用 ImageMagick 來做,而 ImageMagick 日後有機會再作介紹。


====================================================
歡迎轉載,但轉載時請保留此宣告,不得作為商業用途
作者: Sam Tang <admin{at}phpini{dot}com>
來源網站: http://www.phpdc.com/


用戶評論 按這裡發表新評論 
edward edward at hk82 dat com
02 June 2005 18:38
您的方法好好用, 不過, 唔知寫唔寫ram 呢?
 
edward edward at hk82 dat com
02 June 2005 18:39
而且, 如果比人玩refresh, 個server loading 會唔會好大?
 
Pail pail_lo at yahoo dat com dat tw
30 August 2005 17:52
對於這個 php 的 Image module 的功能,
個人覺得它的"效果"不是很好...
比較建議的是使用 ImageStick 這個套件來做
 
 
 發表評論
姓名:
Email:
內容: