常常在處理一些使用者上傳的圖片時
會需要讓系統自動產生圖檔的縮圖(例如無名的相簿預覽等等的功能)PHP程式在處理圖片縮圖的方式
較常見的有兩種: GD ,以及ImageMagick
GD是php內建的圖形函式庫,一般只要安裝php都會有內建此功能
而ImageMagick則是要另外安裝,再用下面的方法呼叫:
// 呼叫 ImageMagic 的 convert exec(“convert -geometry 200×200 big_img.jpg small_img.jpg“);
其它的參數
1.生成縮圖
a.指定大小 # convert -sample 80×40 input.jpg output.jpg
b.利用比例 # convert -sample 25%x25% input.jpg output.jpg
2.旋轉圖形
利用cotate參數,+90表順時針旋轉90度,而-90則表逆時針轉90度
# convert -rotate 90 input.jpg output.jpg
3.轉換格式
以附檔名為準,如下例就是將jpg轉換成png的用法
# convert input.jpg output.png
4.一次使用多種命令
# convert -sample 25%x25% -spread 4 \ -charcoal 4 input.jpg output.jpg
詳細使用方法請參照:
http://www.imagemagick.org/script/index.php
GD圖形函式庫除的詳細功能可參照:
http://www.php5.idv.tw/modules.php?mod=books&act=index&cid=29
下面為一個用GD函式庫所寫成的縮圖函式。
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
class resize_img { var $image_path = ''; //holds the image path var $sizelimit_x = 250; //the limit of the image width var $sizelimit_y = 250; //the limit of the image height var $image_resource = ''; //holds the image resource var $keep_proportions = true; //if true it keeps the image proportions when resized var $resized_resource = ''; //holds the resized image resource var $hasGD = false; var $output = 'SAME'; //can be JPG, GIF, PNG, or SAME (same will save as old type) function resize_img() { if( function_exists('gd_info') ){ $this->hasGD = true; } } function resize_image( $image_path ) { if( $this->hasGD === false ){ return false; } //no GD installed on the server! list($img_width, $img_height, $img_type, $img_attr) = @getimagesize( $image_path ); //this is going to get the image width, height, and format if( ( $img_width != 0 ) || ( $img_width != 0 ) ) //make sure it was loaded correctly { switch( $img_type ) { case 1: //GIF $this->image_resource = @imagecreatefromgif( $image_path ); if( $this->output == 'SAME' ){ $this->output = 'GIF'; } break; case 2: //JPG $this->image_resource = @imagecreatefromjpeg( $image_path ); if( $this->output == 'SAME' ){ $this->output = 'JPG'; } break; case 3: //PNG $this->image_resource = @imagecreatefrompng( $image_path ); if( $this->output == 'SAME' ){ $this->output = 'PNG'; } } if( $this->image_resource === '' ){ return false; } //it wasn't able to load the image } else{ return false; } //something happened! if( $this->keep_proportions === true ) { if( ($img_width-$this->sizelimit_x) > ($img_height-$this->sizelimit_y) ) { //if the width of the img is greater than the size limit we scale by width $scalex = ( $this->sizelimit_x / $img_width ); $scaley = $scalex; } else //if the height of the img is greater than the size limit we scale by height { $scalex = ( $this->sizelimit_y / $img_height ); $scaley = $scalex; } } else { $scalex = ( $this->sizelimit_x / $img_width ); $scaley = ( $this->sizelimit_y / $img_height ); //just make the image fit the image size limit if( $scalex > 1 ){ $scalex = 1; } if( $scaley > 1 ){ $scaley = 1; } //don't make it so it streches the image } $new_width = $img_width * $scalex; $new_height = $img_height * $scaley; $this->resized_resource = @imagecreatetruecolor( $new_width, $new_height ); //creates an image resource, //with the width and height of the size limits (or new resized proportion ) if( function_exists( 'imageantialias' )){ @imageantialias( $this->resized_resource, true ); } //helps in the quality of the image being resized @imagecopyresampled( $this->resized_resource, $this->image_resource, 0, 0, 0, 0, $new_width, $new_height, $img_width, $img_height ); //resize the iamge onto the resized resource @imagedestroy( $this->image_resource ); //destory old image resource return true; } function save_resizedimage( $path, $name ) { switch( strtoupper($this->output) ) { case 'GIF': //GIF @imagegif( $this->resized_resource, $path . $name . '.gif' ); break; case 'JPG': //JPG @imagejpeg( $this->resized_resource, $path . $name . '.jpg' ); break; case 'PNG': //PNG @imagepng( $this->resized_resource, $path . $name . '.png' ); } } function output_resizedimage() { $the_time = time(); header('Last-Modified: ' . date( 'D, d M Y H:i:s', $the_time ) . ' GMT'); header('Cache-Control: public'); switch( strtoupper($this->output) ) { case 'GIF': //GIF header('Content-type: image/gif'); @imagegif( $this->resized_resource ); break; case 'JPG': //JPG header('Content-type: image/jpg'); @imagejpeg( $this->resized_resource ); break; case 'PNG': //PNG header('Content-type: image/png'); @imagepng( $this->resized_resource ); } } function destroy_resizedimage() { @imagedestroy( $this->resized_resource ); @imagedestroy( $this->image_resource ); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//how to use the class: //makes a simple thumbnail of an image of 100x100 //and saves the image then outputs it. $imgresize = new resize_img(); $imgresize->sizelimit_x = 100; $imgresize->sizelimit_y = 100; $imgresize->keep_proportions = true; $imgresize->output = 'PNG'; if( $imgresize->resize_image('C:/treeshadows_001.gif' ) === false ) { echo 'ERROR!'; } else { $imgresize->save_resizedimage( 'C:/xampp/', 'treeshadows_001' ); $imgresize->output_resizedimage(); } $imgresize->destroy_resizedimage(); |