تولید تصاویر پویا (بخش اول)

September 12, 2005 at 08:26 pm

همان گونه که می دانید تصاویر نه تنها اطلاعات را بصورت واضح در اختیار کاربر قرار می دهد، بلکه در بسیاری از موارد، زیبایی خاصی را به صفحه می بخشد. php به عنوان یک زبان سمت سرویس دهنده، قادر است، تصاویر را ایجاد و یا حتی آن ها را دستکاری کند. برای این منظور از توابعی بهره می گیرد، که در کتابخانه ایی به نام GD قرار دارند. (این کتابخانه از اینجا قابل دریافت است) در این پست قصد داریم جهت آشنایی با توابع آن ها را با هم مرور کرده و در پست های آینده آن ها را بکار گیریم.

این کتابخانه از فرمت های JPEG، PNG و WBMP پشتیبانی می کند. شاید در مورد دو فرمت اولیه اطلاعت زیادی داشته باشید امان در مورد فرمت WBMP همین اندازه بدانید، که در دستگاه های بی سیم همراه این فرمت کاربر زیادی دارد. گویا در گذشته این کتابخانه فرمت GIF را نیز پشتیبانی می کرده اما به دلیل شکایات، این فرمت متعاقبا کنار گذاشته شده است و از طرف gd ساپورت نمی شود.

فعال سازی این کتابخانه تحت ویندوز بسیار ساده است. پس از دریافت نسخه تحت ویندوز فایل dll آن را به پوشه ی extensions انتقال دهید، حال با یک ادیتور متن فایل php.ini را باز کنید عبارت زیر را که در ناحیه Windows Extensions قرار دارد بیابید و علامت سیمیکلون را از ابتدای آن پاک کنید. در انتها فایل را ذخیره و سرور را reset کنید تا تغییرات به سیستم اعمال شود. فعال سازی این کتابخانه در لینوکس کمی دشوارتر است. برای انکه از سطح متوسط مقاله خارج نشویم از توضیح آن خودداری می کنم. ضمنا فکر کنم برنامه نویسی که با لینوکس کار کنه این مفاهیم براش مقدماتی باشه و راه کار رو بدونه

;extension=php_gd.dll 

اگر مراحل را درست انجام داده باشید بخش جدیدی تحت نام gd در پیکربندی PHP اضافه خواهد شد. می توانید به کمک تابع phpinfo از صحت کار اطمینان حاصل کنید. قبل از اینکه تصویر را بسازیم باید یک Canvas یا همان بوم نقاشی ایجاد کنیم. تابعی که بدین منظور استفاده می شود imagecreate نام دارد که دو آرگومان دریافت می کند و به شکل زیر به کار می رود:

$length = 300; 
$width = 100;
$image = ImageCreate($length, $width);

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

$blue = ImageColorAllocate($image, 0, 0, 255); 

هنگامی که بخواهیم بر روی یک تصویر تغییراتی را اعمال کنیم دیگر نیاز نداریم بوم ایجاد کنیم. برای این منظور متناسب با فرمت تصویرمان از توابع ImageCreateFromGIF یا ImageCreateFromPNG یا ImageCreateFromJPEG استفاده خواهیم کرد. هر کدام از این توابع نام فایل را به عنوان پارامتر دریافت می کند. نمونه ی زیر را ببینید:

$image = ImageCreateFromPNG("blank_blue_bttn.png"); 

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

IMageString($image, $fontSize, $x1, $y1, $string, $color);

پس از رسم تصاویر نوبت به نمایش آن ها در مرورگر می رسد. البته در برخی موارد می توان آن ها را در فایلی نیز ذخیره کرد. همانگونه که می دانید برای نمایش هر نوع داده ای غیر از سورس های HTML باید فرمت آن را به مرورگر اطلاع داد. این کار توسط تابع header صورت می گیرد، که بنابر نوع فرمت تصویر، می توانید از یکی از انواع زیر استفاده کنید:

header ("content_type : image/png");
header ("content_type : image/gif");
header ("content_type : image/jpeg");

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

در اینجا تابع imagePNG سه پارامتر دریافت می کند، اولی شناسه تصویر، دومی، نام فایلی که قصد داریم تصویر را در آن ذخیر کنیم و سومی،کولیتی یا کیفیت تصویر را بین 1 تا 100 تعیین می کند. نمونه زیر را ببینید:

imagePng ($image, "alvanweb.png", 2);

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

در ادامه ی این مقاله در پست های آینده سعی می شود با ذکر نمونه های کاربردی، استفاده بهتر از این توابع تحلیل شود.

دسته: پی اچ پی | نویسنده: مرتضی الوانی
  1. 9 نظر برای این مطلب ارسال شده است. نظر خود را ارسال کنيد »

  1. 1

    Payam


    عالی بود ، گر چه اینقدر با این gd سرو کلمه زدم که این مسایل رو درک کردم ، اما خوندن چنین مقاله ای برام لدت بخش بود.
    راستی ، در ورژن های جدید Gd دیگه فرمت gif پشتیبانی نمیشه ؟ نمیدونستم …
    در مورد wbmp هم یکم بیشتر از اینی که شما توضیح دادی اطلاعات داشتم ، اما کنجکاو بودم که بیشتر اطلاعات بدست بیارم ازش ، که متاسفانه شما توضیح بیشتری نداده بودی ، باز هم تشکر از مقالات عالیت ..

    September 13, 2005 at 1:17 am

  2. 2

    کامیار


    نمیدونستم میشه با پی اچ پی این کارا رو هم انجام داد

    September 13, 2005 at 2:46 am

  3. 3

    پيمان


    سلام
    با تشكر از آموزش دقيق و جالبتون – ميخواستم بدونم آيادر php تابعي هست يا ميشه ساخت كه محتويات يك فايل pdf رو بعنوان ورودي بگيره و در خروجي تصوير كل اون رو بصورت فايلي تصويري مثل jpg تحويل بده يا نه ؟
    ممنون

    September 14, 2005 at 1:56 am

  4. 4

    Mohammadix


    d:

    September 14, 2005 at 12:56 pm

  5. 5

    مملی آنلاین


    بسیار مطلب عالی و آموزنده ای بود موفق باشی

    September 15, 2005 at 12:30 am

  6. 6

    محمد


    سلام
    تو اون لینکی که شما برای دانلود این extension دادی فایل درست و حسابی پیدا نکردم … من PHP 4.3.11 دارم و روش این extension نصب شده : php_gd2.dll
    این با اون فرق داره ؟؟

    September 18, 2005 at 6:46 am

  7. 7

    نجفي


    اعلام آمادگي براي تبادل پيوند….. در صورت تمايل به من لينك بدهيد تا متقابلا اقدام شود. با احترام

    September 25, 2005 at 5:31 pm

  8. 8

    ..::ســــــوال::..


    سلام سلام سلام… خوبي شما ؟؟؟ قربان شما !! … من وبلاگمو آپ كردم… يه سوال جديد و تازه!!…خيلي خوشحال ميشم جواب سوالمو از طرف تو هم بدونم… مـــنــــتــــظــــرم…فدات

    October 2, 2005 at 10:45 am

  9. 9

    کلاس نمودار میله ای


    را به همراه یک نمونه کاربرد آن از اینجا دریافت کنید

    January 28, 2006 at 10:33 pm