تغییر اندازه و برش تصاویر انیمیشنی در php

تغییر اندازه و برش تصاویر با imagick

عمدتا هروقت صحبت از تغییر اندازه و برش تصاویر توی php میشه اکثرا یا GD رو انتخاب می‌کنن و یا imagick رو.

معیاری که باعث میشه GD بیشتر استفاده بشه اینه که از نسخه ۴.۳ به بعد همراه خود php نصب میشه. اما imagick برای اینکه جادوش اثر کنه نیاز به مقداری کانفیگ داره که به همین دلیل اگر از هاست اشتراکی استفاده می‌کنید امکان استفاده از اون رو ندارید.

اما از طرف دیگه imagick امکانات بیشتری داره که به نظرم بهترین اونها تغییر اندازه تصاویر GIF بدون از بین بردن انیمیشن هست. چون کتابخانه‌های دیگه بعد از تغییر اندازه تصویر رو به یک فرمت استاتیک تبدیل می‌کنن.

نصب imagick در لینوکس

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

مثل همیشه ابتدا باید وابستگی های مورد نیاز رو نصب کنیم پس:


sudo apt-get install php5 php5-common gcc

و بعد هم نصب imageMagick:


sudo apt-get install imagemagick

و حالا افزونه مربوط به این ابزار رو برای php نصب می کنیم:


sudo apt-get install php5-imagick

بعد هم که باید apache رو مجددا راهندازی کنیم:


sudo apache2 reload

همین ! به قول وردپرس:

ببخشید که منتظر مرحله دیگری بودید.

نصب imagick در ویندوز

توجه داشته باشید که نسخه ۳۲ بیتی کتابخانه هایی که در ادامه معرفی می‌کنم رو دریافت کنید حتی اگر سیستم عاملتون ۶۴ بیتی باشه.

راهنمای انتخاب پکیج

برای انتخاب نسخه مناسب با سیستم عاملتون به مثال زیر توجه کنید:


php_imagick-3.2.0b2-5.5-nts-vc11-x86.zip

در اینجا ۵.۵ به نسخه php اشاره داره، nts برای iis و ویندوز مناسبه و ts برای apache و لینوکس، با استفاده از تابع phpinfo نسخه کامپایلر رو پیدا کنید در این مثال vc11 هست. و در آخر x86 بیانگر ۳۲ بیتی بودن پکیج هست.

مراحل نصب

  • یک پوشه به نام imagick در آدرس php/ext بسازید. (آدرس پوشه php/ext در xampp و wamp متفاوته)
  • آدرس پوشه ساخته شده رو به windows path معرفی کنید. (راهنما)
  • به صفحه دانلود imagick برید و نسخه مناسب با سیستم عاملتون رو دانلود کنید.
  • افزونه imagick رو برای php از صفحه مربوط به افزونه ها دانلود کنید.
  • بعد از استخراج فایل محتویات پوشه bin رو به پوشه imagick که ابتدا ساخته بودید منتقل کنید.
  • فایل php.ini رو باز کنید و آدرس کامل php_imagick.dll رو مثل دستور زیر اضافه کنید


extension=C:\wamp\php\ext\imagick\php_imagick.dll

  • سیستم رو دوباره راهندازی کنید تا تغییرات windows path اعمال بشه. بعد دستور dcraw رو در CMD وارد کنید. اگر تغییرات اعمال شده باشه لیست از پارامتر ها رو مشاهده می‌کنید.
  • تابع phpinfo رو مجددا صدا بزنید درصورتی که همه چیز درست باشه imagick به لیست افزونه‌ها اضافه شده.

مثال اول) تغییر اندازه انیمشن‌های GIF

برای تغییر اندازه یک تصویر انیمیشنی با پسوند gif باید از تابع resizeImage استفاده کنید. بخاطر اینکه تصویر انیمیشنی از چندین فریم تشکیل شده باید با استفاده از حلقه، یکی یکی اونها رو تغییر اندازه بدیم.

// Create new Imagick class
$image_folder = 'images/';
$image_path = 'images/animation.gif'; 
$imagick = new \Imagick($image_path); // $image_path is the path to the image location

// Split gif animation into image
$imagick = $imagick->coalesceImages(); 

// Crop images one by one				  
do {
	 // First parameter is resized image width and second is resized image height
	 // If one of the params is set to zero, image will keep the aspect ratio
$imagick->resizeImage(580, 0, \Imagick::FILTER_BOX, 1);			     
} while ($imagick->nextImage());

// Reassemble the animation				  
$imagick = $imagick->deconstructImages();

// Save gif animation
// This would overwrite the original image
$imagick->writeImages($image_path, true);

مثال دوم) برش دادن انیمیشن‌های GIF

برای برش دادن انیمیشن هم مثل مثال قبل عمل می‌کنیم با این تفاوت که تابع cropImage به جای تابع قبلی استفاده شده.

// Create new Imagick class
$image_folder = 'images/';
$image_path = 'images/animation.gif'; 
$imagick = new \Imagick($image_path); // $image_path is the path to the image location

// Split gif animation into image
$imagick = $imagick->coalesceImages(); 

// Crop images one by one				  
do {
	 // First two params are width and height of the crop and third and fourth are the starting points of the crop
	 // E.g. if the last two params are 0,0, that means that cropping will start from the top left corner
	 $imagick->cropImage(400, 200, 0, 0);

	 // After the crop, there is some blank space remaining on the image since the image canvas has remained the same size
	 // This function resizes the image canvas and thus eliminates the blank space
               $imagick->setImagePage(400, 200, 0, 0);
				     
} while ($imagick->nextImage());

// Reassemble the animation				  
$imagick = $imagick->deconstructImages();

// Save gif animation
// This would overwrite the original image
$imagick->writeImages($image_path, true);

جمع بندی

کتابخانه imagick فرمت‌های گسترده ای (از جمله SVG) رو پشتیبانی می‌کنه و برخلاف GD از سرعت پردازش و آپشن های بیشتری برخورداره. البته قابلیت های اون باعث می‌شه که به یک سرور نسبتا قدرتمند برای پردازش نیاز پیدا کنید. که به نظرم چیز عجیبی نیست چون به طور کلی عملیات پردازش روی تصویر همیشه نیازمند منابع بالایی بوده و هست.

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

در ادامه این بحث می‌تونید مثال های بیشتری رو در اینجا ببینید و همچنین برای مقایسه این کتابخانه با GD هم خوندن این مقاله رو پیشنهاد میکنم.

نظری در این مورد دارید؟ خوشحال می‌شم اون رو برام ارسال کنید