آشنایی با GD ، ایجاد تصاویر گرافیکی به صورت پویا در php

ALI4GHA

Member
سلام

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

اطلاعات من در حد مبتدی و گاهی متوسط است و ممکن است به کار حرفه ای ها نیاید اما اگر شما تازه کار با GD را آغاز کرده اید مطمئنا در این تاپیک مطالب جالبی پیدا خواهید کرد .

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

بریم سر اصل مطلب و در ابتدا یکسری مقدمات :

خیلی ها فکر می کنند که php یک زبان برنامه نویسی است که به ایجاد یکسری صفحات html و انجام یکسری محاسبات محدود شده است اما این تفکر کاملا نادرست است زیرا php نه تنها می تواند این کارها را در سطح بسیار حرفه ای و با قدرت انجام دهد بلکه امکان ایجاد و ویرایش فرمت های مختلف تصویری همانند gif , png , jpg ,... را نیز داراست .
ما در این تاپیک به بحث و تبادل نظر پیرامون دستورات و توابع php در رابطه با تصاویر خواهیم پرداخت ، سعی می کنم مطالب را در دسته های زیر به ترتیب بیان کنم تا کاربران دچار سردرگمی نشوند :

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

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

ALI4GHA

Member
دریافت و فعال سازی Gd

پشتیبانی از GD در php بصورت پیشفرض فعال نیست و باید آن را فعال کرد ، در ویندوز کار بسیار ساده است و نیاز به دریافت gd نیست ، اما در لینوکس ابتدا باید کتابخانه gd را از سایت زیر دریافت کرد :

http://www.boutell.com/gd

من در اینجا آموزش فعال سازی gd در ویندوز را می نویسم تا کسانی که از php بر روی localhost استفاده می کنند از آن بهره ببرند و از آموزش راه اندازی gd بر روی لینوکس می گذرم چون معمولا gd در سرورهای هاستینگ فعال است ( اگر نیاز بود بگویید تا آموزش بدهم ).

همان طور که گفتم فعال سازی gd در ویندوز بسیار ساده است و فقط کافی است extension مربوط به آن را فعال کنید ، برای این کار فایل php.ini را با notepad باز کنید و به دنبال سطر زیر بگردید :

;extension=php_gd2.dll​

حال سمی کولن (;) را از ابتدای این سطر پاک کنید .
پس از انجام این کار باید چک کنید که فایل php_gd.dll در مسیر مشخص شده در extension_dir وجود داشته باشد .

حالا سرویس www publishing را Restart کنید .

کار تمام شد ، اگر می خواهید از فعال شدن این extension مطمئن شوید کافی است تابع phpinfo() را فراخوانی کنید و در خروجی آن به قسمت gd مراجعه کنید .
 

ALI4GHA

Member
کاربرد تابع gd_info() و بررسی پیکربندی

برخی از ویژگی های gd مانند پشتیبانی از jpeg به کتابخانه های خارجی نیاز دارد ، برای اطلاع از فعال یا غیر فعال بودن این قبیل خصوصیات تابع gd_info(0) بسیار کاربردی است . این تابع نیاز به آرگومنت ندارد و یک آرایه انجمنی را درباره تنظیمات gd بر می گرداند .

برای اجرای این تابع به این صورت عمل می کنیم :

PHP:
<?php
	print "<pre>";
	print_r( gd_info() );
	print "</pre>";
?>

با اجرای این اسکریپت خروجی زیر نشان داده می شود :

کد:
Array
(
    [GD Version] => bundled (2.0.28 compatible)
    [FreeType Support] => 1
    [FreeType Linkage] => with freetype
    [T1Lib Support] => 
    [GIF Read Support] => 1
    [GIF Create Support] => 1
    [JPG Support] => 1
    [PNG Support] => 1
    [WBMP Support] => 1
    [XPM Support] => 
    [XBM Support] => 1
    [JIS-mapped Japanese Font Support] => 
)

در خروجی بالا عدد 1 به معنی پشتیبانی از خصیصه ی مربوطه می باشد ، مواردی که نیاز به توضیح دارد به شرح زیر است :

FreeType Support : پشتیبانی از فونت های FreeType
FreeType Linkage : کتابخانه مورد استفاده برای ارائه قابلیتهای FreeType
T1Lib Support : پشتیبانی از فونت های type 1
JIS-mapped Japanese Font Support : پشتیبانی از کاراکتر های استاندارد ژاپنی

فکر نمی کنم بقیه موارد هم نیاز به توضیح داشته باشد .
 

ALI4GHA

Member
ایجاد و نمایش تصاویر با تابع imagecreate ()

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

PHP:
$image = imagecreate (200,200);

php برای کار بر روی تصاویر توابع متعددی ارائه می دهد برای مثال هنگام کار با یک فایل png از تابع زیر استفاده می شود :

PHP:
 imagecreatefrompng ()

و یا برای کار با تصاویر jpeg از این تابع :

PHP:
imagecreatefromjpeg ()

البته قبل از استفاده از این توابع باید مطمئن شوید که gd از فرمت مورد نظر شما پشتیبانی می کند .
 

ALI4GHA

Member
دوستان فکر کنم شما به تذکر های آقا سیاوش و من توجه نکردید :

به دلیل اینکه اینجا انجمن مقالات و آموزش ها است از پاسخ به سوالات شما معذوریم
شما فقط می توانید آموزش هایتان را در این تاپیک قرار دهید


شما می توانید پرسش های خود را در رابطه با این موضوع در تاپیک زیر بپرسید :

پرسش و پاسخ : آشنایی با GD ، ایجاد تصاویر گرافیکی به صورت پویا در php
 

ALI4GHA

Member
کار با رنگ ها توسط تابع imagecolorallocate()

در gd برای کار با رنگ ها شما ابتدا می بایست یک منبع از نوع رنگ ایجاد کنید ، برای این کار از تابع imagecolorallocate() استفاده می کنیم . این تابع یک منبع از نوع تصویر و سه عدد بین 0 تا 255 که به ترتیب میزان رنگ های قرمز ، سبز و آبی را مشخص می کنند را دریافت و یک منبع از نوع تصویر را بر می گرداند .

PHP:
 $image = imagecreate( 200, 200 );
 $red = imagecolorallocate( $image, 255, 0, 0 );

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

PHP:
<?php
 header("Content-type: image/png");
 $image = imagecreate( 200, 200 );
 $red = imagecolorallocate( $image, 255, 0, 0 );
 imagepng($image);
?>

در اسکریپت بالا که با توابع معرفی شده ایجاد شده است ما با ارسال هدر Content-type به مرورگر اطلاع می دهیم که این داده از نوع تصویر است .
شما می توانید اسکریپت زیر را در تگ IMG نیز فراخوانی کنید :

HTML:
<img border="0" src="sample.php" width="200" height="200">

این نمونه یک تصویر png ایجاد می کند شما بسته به تنظیماتی که انجام داده اید می توانید سایر فرمت های تصویری را هم ایجاد کنید .
 

ALI4GHA

Member
رسم یک خط ساده با تابع imageline ()

برای ایجاد یک خط در یک تصویر شما می بایست مختصات نقطه ابتدایی و نقطه انتهای خط را مشخص کنید . در gd گوشه سمت چپ بالای تصویر شروع تصویر محسوب می شود و ایندکس ها از صفر شروع می شوند یعنی یک پیکسل با مختصات 2 و 5 در واقع در مختصات 3 و 6 قرار می گیرد .
تابع imageline () یک خط را بین دو نقطه ایجاد می کند ، آرگومنت اول این تابع یک منبع از نوع تصویر را مشخص می سازد چهار آرگومنت بعدی هم مختصات ابتدا و انتهای خط را تعیین می کنند . آرگومنت آخر هم یک منبع از نوع رنگ دریافت می کند .

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

PHP:
<?php
 header("Content-type: image/png");
 $image = imagecreate( 200, 200 );
 $red = imagecolorallocate($image, 255,0,0);
 $blue = imagecolorallocate($image, 0,0,255 );
 imageline( $image, 0, 0, 199, 199, $blue );
 imagepng($image);
?>

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

ALI4GHA

Member
رنگ آمیزی با تابع imagefill ()

تابع imagefill () در php همان کاری را انجام می دهد که شما در یک برنامه گرافیکی می توانید انجام دهید ، این تابع با آرگومنت هایی که دارد به شما امکان رنگ آمیزی اشکال مختلف را خواهد داد . آرگومنت های این تابع در زیر معرفی شده اند :

. یک آرگومنت از نوع منبع تصویر
. مختصات آغاز تصویری که باید رنگ شود
. یک منبع از نوع رنگ

در اسکریپت زیر نحوه استفاده از این تابع نشان داده شده است :

PHP:
<?php
 header("Content-type: image/png");
 $image = imagecreate( 200, 200 );
 $red = imagecolorallocate($image, 255,0,0);
 $blue = imagecolorallocate($image, 0,0,255 );
 imageline( $image, 0, 0, 199, 199, $blue );
 imagefill( $image, 0, 199, $blue );
 imagepng($image);
?>

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

ALI4GHA

Member
رسم دایره و کمان با تابع imagearc ()

از تابع imagearc () می توان برای رسم کمان و دایره استفاده کرده ، آرگومنت های این تابع به شرح زیر می باشد :

. یک منبع از نوع تصویر
. مرکز کمان
. عرض
. ارتفاع
. نقاط شروع و پایان
. یک منبع از نوع رنگ

کمان های ایجاد شده با این تابع در جهت عقربه های ساعت رسم می شوند شروع کمان از ساعت 3 می باشد . کد زیر یک نیم داریره رسم می کند :

PHP:
imagearc( $image, 99, 99, 180, 180, 0, 180, $blue );

کد فوق یک نیم دایره به مرکزی با مختصات 99 ، 99 و با ارتفاع و عرض 180 رسم می نماید . در دستور زیر یک دایره رسم و آن را رنگ آمیزی می کنیم :

PHP:
<?php
 header("Content-type: image/png");
 $image = imagecreate( 200, 200 );
 $red = imagecolorallocate($image, 255,0,0);
 $blue = imagecolorallocate($image, 0,0,255 );
 imagearc( $image, 99, 99, 180, 180, 0, 360, $blue );
 imagefill( $image, 99, 99, $blue );
 imagepng($image);
?>
 

ALI4GHA

Member
افزودن متن به تصاویر

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

بریم سر اصل مطلب


با استفاده از توابعی که تا حالا معرفی کردم و چند تا تابع جدید قصد دارم روشی برای افزودن متن به تصاویر را آموزش بدهم .

من قصد دارم متن majidonline را بر روی یک تصویر با نام sample.png درج کنم و سپس یک خروجی از نوع تصویر دریافت کنم ، به کدهای زیر توجه کنید :


PHP:
<?
   $image = ImageCreateFromPNG("sample.png");
   $white = ImageColorAllocate($image,255,255,255);
   $font = "arial.ttf";
   if(isset($_GET[text]))
     $text = $_GET[text]; 
   else
      $text = "majidonline"; 
   $size = "20";
   $angle="0";
   $textbox = ImageTTFBbox($size, $angle, $font, $text);
   $textbox_width = abs($textbox[2] - $textbox[0]);
  $textbox_height = abs($textbox[12] - $textbox[1]);
  $image_width = ImageSX($image);
  $image_height = ImageSY($image);
  $x = ($image_width - $textbox_width) / 2;
  $y = ($image_height - $textbox_height) / 2 + $textbox_height;
  ImageTTFText($image, $size, $angle, $x, $y, $white, $font, $text);
  Header("Content-type: image/png");
  ImagePNG($image);
  ImageDestroy($image);
?>

در خط دوم این اسکریپت از تابع ImageCreateFromPNG() استفاده شده که یک فایل png را دریافت و سپس تصویری از آن ایجاد می کند ، در این اسکریپت از تابع ImageTTFBbox() که ابعاد متن خاصی را برمی گرداند و نیز توابع ImageSX و ImageSY برای بدست آموردن طول و عرض تصویر ایجاد شده استفاده شده است ( در صورت نیاز به توضیح بیشتر ،سوال خود را در تاپیک پرسش و پاسخ بپرسید ) در سطر 18 متن بر روی تصویر ایجاد و در سطر 20 تصویر جدید به مرورگر ارسال شده است .
در سطر 21 حافظه مصرفی با تابع ImageDestroy رها می شود .
 

amirepsilon

Active Member
علی جون کارت عالیه
فقط میشه بگی این آموزش ها رو خودت مینویسی
یا کس دیگه ای قبلا نوشته !
ممنون
یا علی
 

جدیدترین ارسال ها

بالا