مقایسه دو کتابخانه GD و ImageMagick در PHP

ImageMagick vs GD

15 اسفند 1400
ImageMagick-vs-GD

اگر می‌خواهید یک تصویر کوچک ایجاد کنید، یک فیلتر را روی یک تصویر اعمال کنید یا آنرا به روشی دیگر به فرمت دیگری تبدیل کنید، باید از یک کتابخانه پردازش تصویر در برنامه PHP خود استفاده کنید و این به این معنی است که احتمالاً کتابخانه‌های GD یا ImageMagick را انتخاب خواهید کرد. اما کدام یک، از طیف وسیع‌تری از فرمت‌های تصویری پشتیبانی می‌کند؟ آیا یکی از آنها کندتر از دیگری است؟ در انتخاب کتابخانه مناسب چه معیارهای دیگری را باید در نظر گرفت؟ در این مقاله به بررسی ویژگی‌های هردو کتابخانه خواهیم پرداخت و آنها را باهم مقایسه خواهیم کرد.

کتابخانه‌های GD و ImageMagick در PHP در دسترس هستند به شرطی که همراه با خود PHP نصب و پیکربندی شده باشند. کتابخانه GD به طور پیش فرض از PHP 4.3 گنجانده شده است، بنابراین احتمالاً می‌توانید از آن در پروژه های خود در اکثر محیط‌های سرور استفاده کنید. از سوی دیگر، ImageMagick ممکن است همیشه در دسترس نباشد و برخی از شرکت‌های میزبان آن را در پیشنهادات خود لحاظ نکنند.

برای بررسی در دسترس بودن هر دو کتابخانه، می‌توانید چند خط کد را اجرا نمایید. توابع ImageMagick queryFormats() و GD gd_info() فرمت‌های تصویری را که توسط هر یک از کتابخانه‌ها پشتیبانی می‌شوند فهرست می‌کنند:

if(extension_loaded('gd')){ 
  print_r(gd_info());
}else{ 
  echo 'GD is not available.'; 
}

if(extension_loaded('imagick')){
  $imagick = new Imagick();
  print_r($imagick->queryFormats());
}else{ 
  echo 'ImageMagick is not available.'; 
}

انواع فایل‌های پشتیبانی شده

فهرست فرمت‌های تصاویر پشتیبانی‌ شده که پس از اجرای کد چاپ می‌شوند، اولین نشانه‌ای است که نشان می‌دهد کتابخانه ImageMagick عملکرد بسیار بیشتری نسبت به GD ارائه می‌کند. کتابخانه GD فقط از فایل‌های JPG، PNG، GIF، WBMP، WebP، XBM و XPM پشتیبانی می‌کند، که در مقایسه با بیش از صد نوع فایل که توسط کتابخانه ImageMagick مدیریت می‌شود، چندان قابل مقایسه نیست.

ممکن است فکر کنید که احتمالاً هرگز از تمام این نوع فایل‌های غیرمعمول که توسط ImageMagick پشتیبانی می‌شوند استفاده نخواهید کرد، اما امکان دارد این تحلیل شما درست نباشد. فردی را می‌شناسم که در یکی از پروژه‌هایش مجبور شد از GD به ImageMagick سوئیچ کند فقط به این دلیل که، اولی از فایل‌های TIFF پشتیبانی نمی‌کرد.

عملکرد کتابخانه های GD و ImageMagick

هر دو کتابخانه GD و ImageMagick برخی از عملکردهای اساسی را ارائه می‌دهند مانند:

- تغییر اندازه و برش تصاویر
- ایجاد تصاویری که از اشکال سفارشی، متن و سایر فایل‌های تصویری تشکیل شده اند
- اعمال فیلترهای تصویر (تغییر روشنایی، کنتراست، رنگ آمیزی و غیره)

کارایی

حقیقت را بگوییم، اگر فقط می‌خواهید مجموعه‌ای از ریزعکس‌ها را ایجاد کنید یا یک تبدیل ساده روی یک تصویر اعمال کنید، نباید به مقایسه عملکرد هر یک از کتابخانه‌های پردازش تصویر اهمیت دهید.

در یک سری آزمایش که روی یک پیکربندی سرور معمولی انجام شد، ایجاد یک تصویر کوچک از یک تصویر JPG با حجم 3 مگابایت حدود 0.6 ثانیه با استفاده از ImageMagick و حدود 0.5 ثانیه با استفاده از GD طول کشید. بنابراین کل فرآیند صرف نظر از اینکه از کدام کتابخانه استفاده می‌شود زمان زیادی را صرف نمی‌کند. پس از مرور وب و جستجوی تست‌های سرعت هر دو کتابخانه، به سرعت متوجه خواهید شد که هیچ یک از آنها از نظر عملکرد برجسته نیستند. گاهی اوقات کتابخانه GD ممکن است سریع‌تر کار کند و گاهی اوقات نیز ImageMagick سرعت بیشتری دارد. می‌توان گفت که سرعت هردو به نوع استفاده بستگی دارد. هنگام تصمیم‌گیری در مورد استفاده از GD یا ImageMagick، این معیار را به عنوان یک معیار مهم در نظر نگیرید.

سبک کدنویسی

اگر کدهای مربوط به تبدیل تصاویر را که با استفاده از کتابخانه GD و ImageMagick نوشته شده است با یک‌دیگر مقایسه کنید، به سرعت متوجه خواهید شد که بین کدها چندین تفاوت وجود دارد.

از طریق مجموعه‌ای از توابع که در کتابخانه GD در دسترس است مانند getimagesize() و imagecreatetruecolor() می‌توانیم سایز و رنگ یک عکس را تغییر دهیم. بیایید باهم مثالی را مشاهده کنیم :

$src_img = imagecreatefromjpeg('source.jpg');
if(!$src_img){ 
  die('Error when reading the source image.'); 
} 
$thumbnail = imagecreatetruecolor(800, 800);
if(!$thumbnail){ 
  die('Error when creating the destination image.'); 
}
$result = imagecopyresampled($thumbnail, $src_img, 0, 0, 0, 0, 800, 800, 1600, 1600); 
if(!$result){ 
  die('Error when generating the thumbnail.'); 
} 
$result = imagejpeg($thumbnail, 'destination.jpg');
if(!$result){ 
  die('Error when saving the thumbnail.'); 
}
$result = imagedestroy($thumbnail);
if(!$result){ 
  die('Error when destroying the image.');
}

از آنجایی که در صورت بروز خطا، استثناها ایجاد نمی‌شوند، بنابراین تمام روند مدیریت خطاها باید با بررسی نتیجه هر تابع GD اجرا شود. متاسفانه این تعداد از آرگومان‌ها برای کدنویسی یک برنامه، خوب نیستند.

نکته دیگری که ممکن است چندان راحت نباشد این است که عملکردهای تابع خواندن و ذخیره یک تصویر، بسته به نوع و فرمت تصویر متفاوت است. بنابراین اگر می‌خواهید اسکریپت تولید کننده تصاویر کوچک شما، انواع مختلف فایل را مدیریت کند، باید کدی مانند زیر اضافه کنید :

switch($image_type){ 
  case 'gif' : $src_img = imagecreatefromgif($path); 
  break; 
  case 'png' : $src_img = imagecreatefrompng($path); 
  break; 
  case 'jpg' : case 'jpeg' : $src_img = imagecreatefromjpeg($path); 
  break; 
  default: return false; 
  break; 
}
//continue with creating the thumbnail

سپس، شما باید بسته به نوع فرمت تصویر، عملکردهای مختلفی را اجرا کنید تا تصویر مورد نظر در فرمت مناسب ذخیره شود. همانطور که می‌بینید، کدنویسی با کتابخانه GD به سرعت پیچیده می‌شود.

فقط کافیست به کد ImageMagick که همان عملیات بالا را انجام می‌دهد نگاه کنید تا متوجه تفاوت گسترده آن شوید :

try{ 
  $imagick = new Imagick(); 
  $imagick->readImage('source.jpg');
  $imagick->thumbnailImage(800, 800);
  $imagick->writeImage('destination.jpg');
}catch(Exception $e){ 
  die('Error when creating a thumbnail: ' . $e->getMessage()); 
}

کتابخانه ImageMagick از طریق کلاس Imagick قابل دسترسی است. بنابراین، ما می‌توانیم از تمام مزایای پارادایم برنامه نویسی شی‌گرا بهره‌ مند شویم. هنگام استفاده از کتابخانه ImageMagick، فقط کافیست تمام کدها را در یک بلوک try-catch بپیچید و سپس برنامه شما با خیال راحت اجرا می‌شود.

همانطور که در کد بالا می‌بینید، اسکریپت ImageMagick که مسئولیت ایجاد یک تصویر کوچک را بر عهده دارد، حاوی هیچ کد مرتبطی با نوع فرمت تصویر نیست. از همان کد ممکن است برای پردازش تصاویر JPG و همچنین فایل‌های PNG یا TIF استفاده شود و اگر نیاز به تبدیل تصویر به نوع دیگری دارید، کافی است قبل از اجرای writeImage() یک خط کد به آن اضافه کنید :

$image->setImageFormat('PNG');

کدام یک بهتر است؟ به نظر من، پردازش تصاویر با استفاده از توابع کتابخانه GD به اندازه کتابخانه ImageMagick مفید نیست. البته، بسته‌بندی‌های مختلفی برای GD وجود دارد که آن را شی‌گرا می‌کند.

محبوبیت

از آنجایی که کتابخانه GD به طور پیش فرض در تمام نسخه های جدید PHP گنجانده شده است، احتمالاً این کتابخانه را در پروژه های مختلف بیشتر از ImageMagick خواهید دید.

جایگزین‌ها

هنگامی که تصمیم می‌گیرید چگونه پردازش تصویر را در برنامه خود انجام دهید، نیازی به استفاده از یک کتابخانه PHP یا کتابخانه دیگر ندارید. راه‌‌حل‌ های دیگری نیز وجود دارد که قابل تامل است :

  • از یک اسکریپت پردازش تصویر استفاده کنید که خارج از برنامه PHP کار می کند
  • از یک پلتفرم پردازش تصویر مبتنی بر وب استفاده کنید
  • از API ها استفاده کنید

خلاصه

همانطور که می‌بینید، هر یک از کتابخانه‌های پردازش تصویر مزایا و معایب خود را دارند. کتابخانه GD بطور گسترده در دسترس است، بنابراین احتمالاً در همه جا کار خواهد کرد. از آنجایی که محبوب است، با استفاده از این کتابخانه به راحتی می‌توانید نمونه‌ها و مؤلفه‌های زیادی را پیدا کنید. دریافت کمک نیز ممکن است آسان‌تر باشد زیرا افراد بیشتری با کتابخانه GD نسبت به ImageMagick آشنا هستند.

اما از طرفی کتابخانه ImageMagick از انواع فایل‌های بیشتری پشتیبانی می‌کند و می‌تواند تصاویر را به روش‌های بسیار ساده‌تری نسبت به کتابخانه GD تبدیل کند. همچنین به شما امکان می‌دهد کدهایی با وضوح و کیفیت بالاتر بنویسید.

در نهایت، جایگزین‌هایی نیز وجود دارند مانند خدمات پردازش تصاویر اَبری، که ممکن است نیاز به هر یک از این‌ها را به طور کامل برطرف کند.


منبع: وب سایت sitepoint

نویسنده شوید
دیدگاه‌های شما

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.