تعداد بازدید: 5138

کار با gdLibrary در php

کتابخانه gd برای کار بار تصاویر به صورت پویا در زبان های برنامه نویسی نظیر PHP می باشد که توسط زبان C نوشته شده است. این کتابخانه از فرمت های متفاوتی نظیر jpg , jpeg , png , gift پشتیبانی می کند.

  • ساخت بوم نقاشی (Create Image)
  • ساخت رنگ
  • توابع گرافیکی
    • توابع ترسیمی GD – رسم اشکال هندسی
      • pixel , line , rectangle , ellipse …
    • توابع غیر ترسیمی GD
      • خواندن تصاویر
      • کپی تصاویر
    • نوشتن روی عکس – imagestring
      • تنظیمات فونت و استایل متون
  • ذخیره یا نمایش تصویر
  • آزاد کردن حافظه (destroy image)

از توابع این کتابخانه جهت ساخت captcha یا بهینه سازی و تغییر سایز تصاویر یا واترمارک استفاده می شود. همچنین یک صفحه پویا بسازیم که یک تصویر را نمایش می دهد .

روال کلی کار با تصاویر در این کتابخانه به شکل زیر است :

  1. برای ساخت تصویر ابتدا باید بوم نقاشی را ایجاد کنیم .
  2. بعد رنگ های مورد نیازمون رو با استفاده از handler بومی که ساختیم بسازیم .
  3. حالا بوم و رنگ ها رو داریم و می تونیم تصویر رو پردازش کنیم.
  4. در نهایت باید تصویر رو ذخیره کنیم یا نمایش دهیم.
  5. در پایان کار حافظه رو آزاد کنیم.

ساخت بوم تصویر

برای این کار از دو تابع imagecreate و imagecreatetruecolor استفاده می کنیم:

  • imagecreate : این تابع برای ساخت تصاویر با فرمت jpg استفاده می شود. این تابع اولین رنگی که با آن ساخته شود را به صورت بک گراند استفاده می کند. حجم تصاویر ساخته شده با این تابع کم تر می باشد. از transparency پشتیبانی نمی کند و برای ساخت captcha و تصاویری که کیفیت برای آن ها مطرح نمی باشد استفاده می شود. رنگ زمینه در این تابع اولین رنگ ساخته شده با handler این تابع می باشد.
  • imagecreatetruecolor : برای ساخت تصاویر با فرمت png استفاده می شود و از transparency پشتیبانی می کند. دامنه رنگ هایی که پشتیبانی می کند بیشتر است – imagecolorallocatealpha – و برای ساخت گالری تصاویر و واترمارک استفاده می شود. حجم تصاویر خروجی بالاتر و زمان پردازش بیشتری دارد. رنگ زمینه در این تابع سیاه است.
$image = imagecreate(100,50);

پارامتر های توابع بالا Width , Height می باشد یک handler را برای انجام پردازش های لازم روی تصویر و ساخت رنگ به عنوان خروجی می دهد.

بوم های ساخته شده در حافظه سرور ذخیره می گردد و به همین منظور باید در انتها حافظه ها را آزاد کنیم.

ساخت رنگ

برای ساخت رنگ نیاز به handler بوم که در مرحله قبل ساختیم نیاز داریم. بسته به نوع رنگ نیز باید فرمت بوم ما متفاوت باشد. رنگ ها در GD از فرمت RGB پیروی می کنند.یعنی برای ساخت هر رنگی باید از سه رنگ red , blue , green استفاده می کنیم.

برای تولید رنگ از توابع imagecolorallocate و imagecolorallocatealpha پشتیبانی می کند.

  • imagecolorallocate : از ۲۵۶ رنگ دارد و از شفافیت پشتیبانی نمی کند.
  • imagecolorallocatealpha :‌ از ۲۲۴ رنگ دارد و از شفافیت پشتیبانی می کند.

پارامتر های این توابع handler بوم ساخته شده در مرحله قبل و رنگ های red , green , blue می باشد.

$image = imagecreate(100,50);
$blue = imagecolorallocate($image , 0 , 0 , 255);

در کد بالا رنگ آبی را اینجا کردیم . ضمن اینکه این رنگ به عنوان رنگ اول بوم به عنوان رنگ زمینه بوم نیز عمل می کند (به واسطه استفاده از تابع imagecreate). خروجی تصویر در صورت نمایش یا ذخیره به یک مستطیل آبی است.

در تابع imagecolorallocatealpha پارامتر نهایی alpha است که میزان شفافیت را تعیین می کند.

$image = imagecreatetruecolor(100,50);
$blue_opacity = imagecolorallocatealpha($image, 0, 0, 255, 75);

برای استفاده از این تابع باید بوم با استفاده از imagecreatetruecolor ساخته شده باشد. مقدار alpha بین اعداد ۰ تا ۱۲۷ است که به صورت پیش فرض عدد ۷۵ می باش.

ذخیره تصویر یا ارسال آن به مرورگر

سیستم GD می تواند تصاویر را بافرمت های jpg , png , gift با استفاده از توابع زیر ذخیره کند.

  • imagejpeg($image, $file_name , $compression) : این تابع تصویر نهایی را به فرمت jpg ذخیره سازی می کند. پارامتر compression در این تابع عددی میان ۰ تا ۱۰۰ می باشد.حجم تصویر نیز بسته به این پارامتر تغییر می کند.
  • imaging($image , $file_name , $quality) : تصویر ایجاد شده با این تابع با فرمت png و پارامتر quality آن عددی بین ۰ تا ۹ می باشد که حجم تصویر نیز بسته به این پارامتر تغییر می کند.
  • imagegif($image , $file_name)

اگر پارامتر $file_name خالی باشد به تصویر به مرورگر ارسال می شود در غیر اینصورت تصویر در path داده شده ذخیره می گردد.

$image = imagecreatetruecolor(120, 20);

// Set the content type header - in this case image/jpeg
header('Content-Type: image/jpeg');

// Output the image
imagejpeg($image);

// Free up memory
imagedestroy($im);
// Create a blank image
$image = imagecreatetruecolor(120, 20);

// Save the image as 'simple.jpg'
imagejpeg($image, 'simple.jpg');

// Free up memory
imagedestroy($image);

آزاد سازی حافظه سرور

همان طور که پیش تر گفتیم بوم ساخته شده در حافظه سرور ذخیره می شود و ما برای بهینه سازی برنامه باید آن را آزاد گردانیم. برای این منظور از تابع imagedestroy استفاده می کنیم.

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

for($i=0;$i<100;$i++){
   $image = imagecreatetruecolor(120, 20);
   imagejpeg($image, 'simple.jpg');
   // Free up memory
   imagedestroy($image);
}

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

در مثال بالا ما در یک حلقه ۱۰۰ تایی بوم و تصویر ایجاد می کنیم. بهتر است آزاد سازی حافظه را به انتهای برنامه موکول نکنیم و پس از ذخیره تصویر آن را آزاد کنیم.

مختصات گرافیکی (cordinate) در GD

مختصات تصاویر در کتابخانه GD به صورت زیر می باشد. محور مختصات در محور Y برعکس محور مختصات ریاضی می باشد یعنی به سمت پایین اعداد محاسبه می شود. اگر بخواهید روی یک تصویر مختصات دهی کنید باید از نمودار زیر پیروی کنید.

php-gd-coordinte-system

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

توابع ترسیمی GD

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

imagesetpixel : برای ساخت پیکسل در بوم تصویر می باشد.

imageline : این تابع بوم و دو مختصات را می گیرد و یک خط با رنگ داده شده می سازد.

imagerectangle : مستطیل می سازد. پارامتر های این تابع مثل تابع imageline می باشد.

imageellipse : این تابع بوم و مختصات وسط بیضی و قطر طولی ، قطر عرضی را می گیرد و با توجه به رنگ border آن را می سازد.

imagearc : این تابع یک کمان ایجاد می کند. پارامتر های این تابع همان پارامتر های تابع imageellipse می باشد ولی در انتها یک درجه برای طول کمان می گیرد که نحوه محاسبه آن ساعتگرد می باشد .زیرا که مختصات در کتابخانه GD که محور Y عکس حالت معمول در ریاضیات می باشد. اگر زاویه برابر با ۳۶۰ باشد دقیقا همان بیضی است.

$img = imagecreatetruecolor(200, 200);
$red   = imagecolorallocate($img, 255,   0,   0);
imagearc($img, 100, 100, 150, 150, 25, 155, $red);

header("Content-type: image/png");
imagepng($img);

imagedestroy($img);

کد بالا یک نیم دایره به شکل لبخند ساخته است به رنگ قرمز.

imagepolygon : این تابع یک آرایه از مختصات ها می گیرد و آن ها را به هم وصل می کند و نتیجه یک چند ضلعی با رنگ داده شده می سازد.

imagefill : از مختصات یک نقطه شروع به رنگ آمیزی می کند تا رسیدن به یک مکان بسته ادامه می دهد.

imagecolorat : این تابع به کمک تابع imagecolorsforindex مختصات یک نقطه را می گیرد و رنگ های متشکل از آن را برمی گرداند.

imagerotate : یک تصویر می گیرد و با توجه به یک درجه خاص آن را میگرداند. تصویر تولید شده را به عنوان یک بوم جدید برمی گرداند بی آنکه در تصویر اصلی تغییری ایجاد کند.

در این تابع وقتی بوم می چرخد تصویر جدیدی ایجاد می گردد که بزرگتر از تصویر اولیه است. رنگ زمینه آن را می توان تغییر داد.

توابع غیر ترسیمی GD

برای کار با تصاویر ذخیره شده روی دیسک ابتدا آن را توسط توابع زیر وارد برنامه می کنیم که بتوانیم با آن ها کار کنیم(تغییر سایز و قرار گرفتن روی بوم خام ، در نظر گرفتن ابعاد ، کپی و ریسایز).

خروجی توابع بالا handler تصویر می باشند که با آن می توانیم کارهایی که زمان ایجاد تصویر می کردیم مثل ذخیره یا رسم شکل روی آن را انجام دهیم. همچنین توابع غیر ترسیمی مثل تغییر سایز کپی را نیز با همین handler انجام می دهیم.

  • imagesx : برگرداندن عرض (width) تصویر با استفاده از handler آن .
  • imagesy : برگرداندن ارتفاع (height) تصویر با استفاده از handler آن .

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

برای این کار از توابع زیر استفاده می کنیم :

imagecopy : این تابع تصویر source و تصویر مقصد destination را می گیرد، مختصات شروع کپی روی destination به همراه مختصات شروع کپی از source و همچنین اندازه کپی (width , height) از روی source را می گیرد و عملیات را روی تصویر destination انجام می دهد.

imagecopy ( $dst_im , $src_im , $dst_x , $dst_y , $src_x , $src_y , $src_w , $src_h )

imagecopymerge : این تابع همانند تابع بالا عمل می کند با این تفاوت که از شفافیت نیز پشتیبانی می کند. یعنی تصویر source به هر اندازه که در destination کپی شده باشد می تواند شفافیت هم داشته باشد.

برای کپی تصاویر به همراه تغییر اندازه آن ها می توانیم از توابع زیر استفاده کنیم :

imagecopyresized : قابلیت کپی تصویر روی بوم خام . قبل از paste کردن تصویر می توان سایز آن را تغییر داد.این تابع سرعت بالایی دارد و کیفیت خروجی آن پایین است.

imagecopyresampled : این تابع دقیقا کار تابع بالا را انجام می دهد . کیفیت بالاتری دارد و سرعت پردازش کم تری نسبت به imagecopyresized .

imagecopyresized ( $dst_image , $src_image , $dst_x , $dst_y , $src_x , $src_y , $dst_w , $dst_h , $src_w , $src_h );
imagecopyresampled ( $dst_image , $src_image , $dst_x , $dst_y , $src_x , $src_y , $dst_w , $dst_h , $src_w , $src_h );

تشریح پارامتر های این توابع :

  • تصویر source و تصویر destination
  • مختصات شروع کپی از روی تصویر source که به صورت src_x , src_y تعیین می شوند.
  • اندازه کپی از روی تصویر source که به صورت width , height تعیین می شود.
  • مختصات شروع paste کردن روی تصویر destination که به صورت dest_x , dest_y تعیین می شود.
  • اندازه paste کردن در پارامتر های بالا dst_w , dst_h می باشد.

توابع نوشتاری GD

برای تولید captcha بسته به نوع استفاده از یکی از توابع imagestring و imagettftext استفاده می کنیم.

imagestring : این تابع یک بوم و یک متن و رنگ و فونت می گیرد و با توجه به مختصات شروع روی تصویر می نویسد.

imagestring ( $image , $font , $x , $y , $string , $color )

پارامتر فونت در این تابع یک عدد میان ۱ تا ۵ است که هر چه بیشتر باشد سایز فونت بزرگتر است.

imagettftext : این تابع با استفاده از فونت TrueType متن را می نویسد.

 imagettftext ( $image ,  $size ,  $angle ,  $x ,  $y ,  $color ,  $fontfile ,  $text )

مثال :

$image = imagecreate(120 , 50);
$white = imagecolorallocate($image , 255 , 255 , 255);
$black = imagecolorallocate($image , 0 , 0 , 0);
$font_size = 20;
$font = "font.ttf";
$coordinates_x = 0;
$coordinates_y = 0;
$angle = 45;
$text = "gnutec";
imagettftext($image , $font_size , $angle , $coordinates_x , $coordinates_y , $color , $font , $text);

در این تابع می توان زاویه تشکیل متن روی بوم تصویر را توسط پارامتر angle تعیین کرد. از این تابع برای تولید supercaptcha استفاده می کنیم.

مطالب مشابه

برنامه نویسی شی گرا در پی اچ پی

شی گرایی در php (قسمت یک)

در این مقاله قصد داریم تا اصطلاحات کلی در رابطه با شی گرایی در زبان پی اچ پی را بررسی کنیم. مفاهیمی که در این جلسه...

معماری های MVC/HMVC

معماری MVC یک قالب برای پیاده سازی رفتار نرم افزار می باشد که بر پایه Model و Controller و View می باشد. controller...

strings-function in php

رشته ها در PHP

توابع مربوط به رشته ها در php کاربردهای زیادی دارند از جمله ساخت رشته های رمزنگاری شده و همچنین ساخت خلاصه متن و تبدیل...

اشتراک گذاری :

مدیر وب سایت گنوتک . برنامه نویسی رو با زبان C در هفده سالگی شروع کردم . در حال حاضر به برنامه نویسی php برپایه معماری MVC , HMVC و همچنین سیستم مدیریت محتوای WordPress و فریم ورک محبوب لاراول علاقه مند هستم و دوست دارم اطلاعاتم رو با شما به اشتراک بگذارم.

۰ دیدگاه برای کار با gdLibrary در php

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *