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
<?php
02
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:
result

test resize 440×504 image by GD lib
code here:

01
<?
02
function resize($img, $w, $newfilename) {
03
 
04
 //Get Image size info
05
 	$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 size
17
	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 Transparent
29
	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 $newfilename
45
	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:result

source code including statically linked Image Magick V4: source

Leave a Reply