Using Image Magick for image processing
Image Magick คำนี่ผมไม่ได้สะกดผิดหรอกนะ แต่มันเป็นชื่อ library ที่ใช้สำหรับ image processing เหมือนกับ GD library แต่ผมคิดว่า performance ของ Image Magick ดีกว่าและใช้จัดการ resource อย่างเช่น memory ได้ดีกว่า Image Magick สามารถใช้ได้ทั้ง command line หรือ interface สำหรับภาษาต่างๆเช่น PHP, JAVA, .NET และอื่นๆ ปัจจุบันมีถึง version 6 สามารถ download และหาดู document ได้จาก website ทางการ : http://www.imagemagick.org แต่version ที่ผมจะนำมาใช้เป็นตัวอย่างเป็น version 4 ซึ่งเป็น statically linked binary (อันนี้ใครรู้วิธี compile สอนผมที)
test resize 440×504 image by Image Magick
code here:
01 <?php02 function resize($img, $w, $newfilename) {03 $path_exe = "convert $img -resize \"$w\" $newfilename";04 exec($path_exe);05 }06 $time_start = microtime(true);07 $mem_before = memory_get_usage();//this function avaliable in PHP 5.2+08 09 resize('alucard.jpg', 100, 'alucard_0.jpg');10 11 $mem_after = memory_get_peak_usage();//this function avaliable in PHP 5.2+12 $time_end = microtime(true);13 $time = $time_end - $time_start;14 print '<table>15 <tr align="center" valign="middle">16 <td ><image src="alucard.jpg"/></td><td > before</td>17 </tr>18 <tr align="center" valign="middle">19 <td ><image src="alucard_0.jpg"/></td><td > after</td>20 </tr>21 </table>';22 print "parse time: $time seconds<br/>";23 print "memory usage before resize: $mem_before<br/> memory peak while resize: $mem_after <br/> memory usage for resize:".($mem_after-$mem_before);24 ?>
result here:
test resize 440×504 image by GD lib
code here:
01 <?02 function resize($img, $w, $newfilename) {03 04 //Get Image size info05 $imgInfo = getimagesize($img);06 $format = ereg_replace(".*\.(.*)$","\\1",$img);07 $format = strtolower($format);08 09 switch ($format) {10 case "gif": $im = imagecreatefromgif($img); break;11 case "jpg":12 case "jpeg": $im = imagecreatefromjpeg($img); break;13 case "png": $im = imagecreatefrompng($img); break;14 default: trigger_error('Unsupported filetype!', E_USER_WARNING); break;15 }16 //calculate size17 if($imgInfo[0]>=$imgInfo[1]){18 $nWidth = $w;19 $nHeight = ($nWidth/$imgInfo[0])*$imgInfo[1];20 }else{21 $nHeight = $w;22 $nWidth = ($nHeight/$imgInfo[1])*$imgInfo[0];23 }24 $nWidth = round($nWidth);25 $nHeight = round($nHeight);26 $newImg = imagecreatetruecolor($nWidth, $nHeight);27 28 // Check if this image is PNG or GIF, then set if Transparent29 if(($imgInfo[2]==3)){30 imagealphablending($newImg, false);31 imagesavealpha($newImg,true);32 $transparent = imagecolortransparent($im);33 imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);34 }elseif(($imgInfo[2] == 1)){35 imagetruecolortopalette($newImg, false, 255);36 $idx = imagecolortransparent($im);37 $rgba = imagecolorsforindex($im,idx);38 $transparent = imagecolorallocatealpha($newImg, $rgba['red'], $rgba['green'], $rgba['blue'],$rgba['alpha']);39 imagecolortransparent($newImg, $transparent);40 imagefilledrectangle($newImg, 0, 0, $nWidth, $nHeight, $transparent);41 }42 imagecopyresampled($newImg, $im, 0, 0, 0, 0, $nWidth, $nHeight, $imgInfo[0], $imgInfo[1]);43 44 //Generate the file, and rename it to $newfilename45 switch ($imgInfo[2]) {46 case 1: imagegif($newImg,$newfilename); break;47 case 2: imagejpeg($newImg,$newfilename); break;48 case 3: imagepng($newImg,$newfilename); break;49 default: trigger_error('Failed resize image!', E_USER_WARNING); break;50 }51 imagedestroy($im);52 return $newfilename;53 }54 $time_start = microtime(true);55 $mem_before = memory_get_usage();//this function avaliable in PHP 5.2+56 57 resize('alucard.jpg', 100, 'alucard_1.jpg');58 59 $mem_after = memory_get_peak_usage();//this function avaliable in PHP 5.2+60 $time_end = microtime(true);61 $time = $time_end - $time_start;62 print '<table>63 <tr align="center" valign="middle">64 <td ><image src="alucard.jpg"/></td><td > before</td>65 </tr>66 <tr align="center" valign="middle">67 <td ><image src="alucard_1.jpg"/></td><td > after</td>68 </tr>69 </table>';70 print "parse time: $time seconds<br/>";71 print "memory usage before resize: $mem_before<br/> memory peak while resize: $mem_after <br/> memory usage for resize:".($mem_after-$mem_before);72 ?>
result here:
source code including statically linked Image Magick V4: source