PDA

بازدید نسخه کامل شده : کتابخانه Gd


emad86_20011
02-27-2006, 08:34 AM
با اجازه مي خوام توابع GD رو آموزش بدمhttp://qsmile.com/qsimages/90.gif گفتم آصف جان تو زحمت نيفتهhttp://qsmile.com/qsimages/247.gif
(اول از همه: اين مبحث مربوط به PHP مي باشدhttp://qsmile.com/qsimages/20.gif)
كتابخانه GD مجموعه اي از ابزار هايي است كه امكانات مفيدي در رابطه با ايجاد تصاوير گرافيكي و پردازش آنها در اختيار برنامه نويس قرار مي دهد. براي اطلاعات بيشتر به آدرس http://www.boutell.com/gd برويد.

چگونگي ايجاد تصاوير و ارسال آنها به خروجي
پيش از هرگونه كاري در اختيار داشتن يك مرجع تصوير الزاميست. تابع imagecreat() اين مرجع را براي ما بدست مي آورد.
اين تابع به دو آرگومان نياز دارد. اولي ارتفاع تصوير و دومي پهناي تصوير. حاصل عمليات اين تابع مرجعي است به يك تصوير گرافيكي كه به فراخواننده باز مي گرداند.
پس از بدست آوردن مرجع تصوير، مي توانيد تصوير مربوطه را به عنوان خروجي بر روي صفحه مرورگر اينترنت نمايش دهيد. براي انجام اين كار از تابع imagegif() استفاده ميكنيم.
<?php
header("Content-type: image/gif");
$image=imagecreate(200, 200);
imagegif($image);
?>
(به خاطر داشته باشيد كه شماره گذاري پيكسل ها از 0 آغاز مي شود، يعني محدوده كاري ما در مثال بالا بين 0 تا 199 هست، فقط در موقع تعريف اندازه تصوير از اندازه هاي واقعي استفاده ميكنيم)

استفاده از رنگ
براي كار با رنگ ها از تابعي استفاده مي كنيم كه مرجعي براي استفاده از رنگ را در اختيارمان قرار دهد.
(با مثال بهتر ميشه فهميدhttp://qsmile.com/qsimages/36.gif)
$red=imagecolorallocate($image, 255, 0, 0);
$image مرجع تصوير است. سه عدد ديگ به ترتيب نماينده رنگ هاي قرمز، سبز و آبي ميباشد.
به محض فراخواني تابع فوق (فقط در بار اول) رنگ پشت صفحه(پيش فرض) مشخص خواهد شد.

رسم خطوط
تابع imageline() اين كار را براي ما انجام مي دهد
imageline($image, $x1, $y1, $x2, $y2, $color);
خوب همونطور كه مشخصه $image مرجع تصوير، x1 و y1 و x2 و y2 مختصات خط و $color هم رنگ مورد نظر ماست كه از تابع imagecolorallocate() به دست اومده.

رنگ آميزي تصاوير
وقتي مي خوايم يك منطقه رو رنگ كنيم (دقيقا مثل تو Paint يا Photoshop) از اين امكان استفاده ميكنيم. تابع مورد نظر imagefill() مي باشد.
imagefill($image, $x, $y, $color);
درست حدس زدين!! $image همون مرجع تصويره!! $xو $y هم مختصات محليه كه ميخوايم رنگ كنيم. $color هم رنگ مورد نظر!

ترسيم كمان
براي كشيدن دايره و نيم دايره و كمان از تابع imagearc() استفاده ميكنيم.
imagearc($image, $x, $y, $width, $height, $angle_a, $angle_b, $color);
$xو $y مركز كمان هستند. $width و $height همونطور كه از اسمشون مشخصه پهنا و ارتفاع هستند.
اگر $angle_a برابر با صفر باشه كشيدن كمان در جهت ساعتگرد و با شروع از ساعت 3 آغاز ميشود و تا زاويه $angle_b ادامه پيدا ميكنه!!
يعني اگر زاويه اول 90 و زاويه دوم هم 180 باشه، يك نيم دايره خواهيم داشت كه از ساعت 6 شروع ميشه ميره تا ساعت 9... يا بهتر بگم يك چهارم دايره اي رسم ميشه كه در سمت چپ پايين قرار داره.
اگر بخوايم يك دايره داشته باشيم زاويه اول رو 0 و دوم رو 360 ميزاريم.

ترسيم چهار ضلعي
با استفاده از تابع imagerectangle() اين كار رو انجام ميديم.
imagerectangle($image, $x1, $y1, $x2, $y2, $color);
مختصات اول نقطه گوشه سمت چپ و بالا رو مشخص ميكنه؛ مختصات دوم نقطه سمت راست و پايين.
خب حالا اگه بخواين توشو رنگ كنين بايد از تابع imagefill كه گفته شد استفاده كنين كه براي اينكه دوباره كاري نشه يك تابع ديگه در نظر گرفته شده كه هم مستطيل ميكشه هم توشو رنگ ميكنه! اسم تابع imagefilledrectangle() هست و دقيقا مثل تابع imagerectangle() استفاده ميشه.

ترسيم چند ضلعي
براي اين كار از تابع imagepolygon() استفاده مي كنيم.
$points=array($x1, $y1, $x2, $y2, ....,...., $xN, $yN);
imagepolygon($image, $points, count($points) / 2, $color);


$points يك آرايه هست كه مختصات رئوس داخلش قرار مي گيرن!! اين رئوس به هم وصل ميشن و شكل تشكيل ميشه.
آرگومان دوم تابع فوق مختصات رئوس كه در آرايه هستند رو ميگيره. آرگومان بعدي تعداد رئوس رو ميگيره، تعداد عناصر آرايه تقسيم بر 2 ميشه تعداد رئوس!
آرگومان آخر هم كه مشخصه!
اگر بخواين هم شكل كشيده بشه و هم توش رنگ بشه از تابع مشابه همين تابع با نام imagefilledpolygon() استفاده ميكنيم.
شفاف سازي رنگ
اگر بخوايم رنگ خاصي رو تو تصوير شفاف كنيم از تابع imagecolortransparent() استفاده ميكنيم.
imagecolortransparent($image, $color);

بهره گيري از متن
براي استفاده از متن بايد كتابخانه FreeType بر روي كامپيوتر يا سرور نصب باشد.

درج يك دنباله كاراكتري با استفاده از تابع imageTTFtext()
$font="/usr/local/.../Tahoma.ttf";
imageTTFtext($image, $font_size, $angle, $x, $y, $color, $font, "YOUR TEXT HERE");

اول از همه بايد فونت مورد نظر روي سرور باشه و ما آدرسشو بدونيم. فونت ها بايد پسوند ttf داشته باشند. ( فايلها با پسوند ttf فونت هاي TrueType را مشخص ميكنند).
آرگومان دوم تابع اندازه فونت، آرگومان سوم زاويه نوشتن، آرگومان چهارم و پنجم مختصات جايي كه ميخوايم بنويسيم، آرگومان ششم رنگ متن، آرگومان هفتم آدرس فونت مورد نظر، آرگومان هشتم متن مورد نظر رو مشخص ميكنه.
يك تابع در اينجا هست كه اونو بعدا توضيح ميدم به نام imageTTFbox()

ذخيره کردن اطلاعات به فرمت Jpeg
$out = fopen("rect.jpg", "w");
gdImageJpeg($image, $out, -1);
fclose($out);
gdImageDestroy (c:\program files\asefsoft\quick smile 3\tools\#gdImageDestroy)($image);
اينو از http://www.boutell.com/gd/manual2.0.33.html#gdImageJpeg گرفتم!! بقيش هم همونجاست!
اول از همه يه فايل باز مي کنيم. بعد با تابع gdImageJpeg() اطلاعات رو به فايل انتقال مي ديم. بعد هم فايل رو ميبنديم!!
در مثال بالا با کیفیت Default عکس ذخیره میشه!! کیفیت رو میتونین از بازه 0 تا 95 انتخاب کنین! (95 بهترین کیفیت بیشترین حجم فایل)

راستي يه تابع هم آخرش استفاده شده به اسم gdImageDestroy(). کارش اينه که اون مرجع عکس رو از بين مي بره!!

اگه خواستین با فرمت png ذخیره کنین از تابع gdImagePng() استفاده میشه!! دقیقا مثل تابع قبل هستش فقط دو تا آرگومان میگیره!! یعنی اون -1 که تو قبلی نوشتین رو نباید اینجا بنویسین.

استفاده از فايل هاي Jpeg و Png
$in = fopen("mypng.png", "rb");
$image = gdImageCreateFromPng($in);
fclose($in);

براي استفاده از فايل هاي png و jpeg و تغيير در اونا اول بايد فايل تصويري مورد نظر باز بشه و اطلاعات از توش گرفته بشه!
توابع gdImageCreatFromPng و gdImageCreatFromJpeg اي کار رو انجام ميدن!! و يک مرجع تصوير براي ما ايجاد ميکنن!
در ضمن هر دو تابع دقيقا مثل هم استفاده ميشه!


منبع: خود آموز PHP در 24 ساعت (ويرايش دوم) - موسسه فرهنگي هنري ديبا گران تهران

mahdi206
02-27-2006, 08:35 AM
جون عماد اينا رو خودت تايپ كردي يا از يه جاي ديگه كش رفتي؟ http://qsmile.com/qsimages/292.gif

emad86_20011
02-27-2006, 08:45 AM
جون عماد اينا رو خودت تايپ كردي يا از يه جاي ديگه كش رفتي؟ http://qsmile.com/qsimages/292.gif
از تو کتاب نوشتم:) می خوای بگی دزدی کردم:cry4: مگه ندیدی آخرش کپی رایت زدم:cry:

Asef
02-27-2006, 01:10 PM
ايول ! اينجور رقابت ها خيلي قشنگه! http://qsmile.com/qsimages/8.gif

Asef
02-27-2006, 01:15 PM
فك كنم يه مثال كامل بد نباشه. من اين كدي كه براي پاپولار اسمايل نوشتم رو ميزارم تا جزييات بيشتري روشن بشه.
function getPopSmilies ()
{
$qr="SELECT * FROM `score` ORDER BY `score` DESC LIMIT 0 , 15";
$result=mysql_query($qr);

$clicks_arr=split("-",$clicks);
$smiles_arr=split("-",$smiles);
for ($i=0; $i<10; $i++)
{
$sm_num=mysql_result($result,$i,"smile");
$imageList [$i]=$sm_num;
}
createPopImageList ($imageList);
}
//createPopImageList
function createPopImageList($imageList)
{
global $distance;
$smilesCount=count($imageList);
$imageHeight=imagePopMaxHeight ($imageList)+30;
$imageWidth=imagePopMaxWidth ($imageList)+$smilesCount*10;

if ($imageWidth<177) $imageWidth=177;
$distance=($imageWidth -imagePopMaxWidth ($imageList))/($smilesCount+1);

$image = imagecreate( $imageWidth, $imageHeight );
$borderColor=imagecolorallocate($image,165,30,20);
$blue = imagecolorallocate($image, 0,0,255 );
$txtColor = imagecolorallocate($image, 10,40,99 );

$borderWidth=5;
imagefilledrectangle($image,$borderWidth,$borderWi dth,$imageWidth -$borderWidth,$imageHeight -$borderWidth,$blue);
imagecolortransparent($image,$blue);
imagestring($image,2,8 ,$imageHeight-20 , "Popular Smilies: qsmile.com", $txtColor );

addPopImages ($imageList,$image);
imagegif($image,"images/pop.gif");
// imagegif($image);
}
function addPopImages ($imageList,$imageSrc)
{
global $distance;
// echo $distance;
$CurPos=$distance;
foreach ($imageList as $image)
{
//echo "fileExist=" . file_exists ("../qsimages/$image.gif");
$imagePop =imagecreatefromgif("../qsimages/$image.gif");
imagecopy($imageSrc,$imagePop,$CurPos,(imagesy($im ageSrc) - imagesy($imagePop)) /2-5,0,0,imagesx($imagePop),imagesy($imagePop));
$CurPos += imagesx($imagePop) + $distance;
}
}
function imagePopMaxHeight ($imageList)
{
$maxHeight=0;
foreach ($imageList as $image)
{
if (imagesy(imagecreatefromgif("../qsimages/" . $image . ".gif")) > $maxHeight)
{
$maxHeight=imagesy(imagecreatefromgif("../qsimages/" . $image . ".gif"));
}
}
return $maxHeight;
}
function imagePopMaxWidth ($imageList)
{
$maxWidth=0;
foreach ($imageList as $image)
{
$maxWidth+=imagesx(imagecreatefromgif("../qsimages/" . $image . ".gif"));
//echo "1-";
}
// echo $maxWidth;
return $maxWidth;
}

emad86_20011
02-27-2006, 01:35 PM
ممنون آصف!! خیلی مثال جالبیه!!
تا حالا با این تابع imageTTFbox کار کردی؟؟ من یه چیزایی فهمیدم ازش ولی نمیتونم توضیح بدم:wacko:

Asef
02-27-2006, 01:52 PM
خب براي تكميل بحث و توضيح سورس خودم كه توي نوشته هاي عماد نبود با اجازه من اضافه ميكنم
اگر بخوايد به جاي ذخيره تصوير روي هاست خروجي تصوير داشته باشيد ابتدا هدر رو از نوع تصوير تعيين ميكنيد
header("Content-type: image/png");
هنگام استفاده از توابع ايجاد كننده تصوير نهايي (imagegif imagepng imagejpeg) پارامتر دوم كه نشان دهنده آدرس تصوير هست رو نمينويسيم
$image = imagecreate( 200, 200 );
$red = imagecolorallocate( $image, 255, 0, 0 );
imagepng($image);

كه ايجاد خروجي به صورت تصوير ميكنه. اگر نياز داريد كه تصوير روي هاست ايجاد بشه فقط آدرس روي هاست رو هم بنويسيد. مثلا:
imagepng($image,"images/PHP_PNG.png");


براي استفاده راحتتر و بدون دردسر از تكست روي تصوير به جاي imageTTFtext از imageString استفاده كنيد كه پارامتر هاي كمتري داره و نياز به فونت هم نيست
for ( $x=1; $x<=5; $x++ ) {
imageString( $image, $x, (20*$x), (20*$x), "Welcome!", $blue );
}


براي بدست آوردن سايز يك تصوير از توابع imagesy و imagesx استفاده ميكنيم


<?php
// create a 300*200 image
$img = imagecreate(300, 200);
echo imagesx($img); // 300
?>

در نهايت براي اينكه ببنيد كتابخانه نصب شده روي سرورتون چه امكاناتي ميده:

<?php
var_dump(gd_info());
?>

Asef
02-27-2006, 02:10 PM
imagettftext
(PHP 3, PHP 4 , PHP 5)
imagettftext -- Write text to the image using TrueType fonts
Description
array imagettftext ( resource image, float size, float angle, int x, int y, int color, string fontfile, string text )

image The image resource. See imagecreate().
size The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).
angle The angle in degrees, with 0 degrees being left-to-right reading text. Higher values represent a counter-clockwise rotation. For example, a value of 90 would result in bottom-to-top reading text.
x The coordinates given by x and y will define the basepoint of the first character (roughly the lower-left corner of the character). This is different from the imagestring()b], where x and y define the upper-left corner of the first character. For example, "top left" is 0, 0.
y The y-ordinate. This sets the position of the fonts baseline, not the very bottom of the character.
color The color index. Using the negative of a color index has the effect of turning off antialiasing. See imagecolorallocate().
fontfile The path to the TrueType font you wish to use.
Depending on which version of the GD library PHP is using, when fontfile does not begin with a leading / then .ttf will be appended to the filename and the library will attempt to search for that filename along a library-defined font path.
When using versions of the GD library lower than 2.0.18, a space character, rather than a semicolon, was used as the 'path separator' for different font files. Unintentional use of this feature will result in the warning message: Warning: Could not find/open font. For these affected versions, the only solution is moving the font to a path which does not contain spaces.
In many cases where a font resides in the same directory as the script using it the following trick will alleviate any include problems.
<?php
// Set the enviroment variable for GD
putenv('GDFONTPATH=' . realpath('.'));
// Name the font to be used (note the lack of the .ttf extension)
$font = 'SomeFont';
?>

text The text string.
May include decimal numeric character references (of the form: €) to access characters in a font beyond position 127. Strings in UTF-8 encoding can be passed directly.
If a character is used in the string which is not supported by the font, a hollow rectangle will replace the character.
imagettftext()[/b] returns an array with 8 elements representing four points making the bounding box of the text. The order of the points is lower left, lower right, upper right, upper left. The points are relative to the text regardless of the angle, so "upper left" means in the top left-hand corner when you see the text horizontally.
Example 1. imagettftext() example[/b]
This example script will produce a white PNG 400x30 pixels, with the words "Testing..." in black (with grey shadow), in the font Arial.


<?php
// Set the content-type
header("Content-type: image/png");
// Create the image
$im = imagecreate(400, 30);
// Create some colors
$white = imagecolorallocate($im, 255, 255, 255);
$grey = imagecolorallocate($im, 128, 128, 128);
$black = imagecolorallocate($im, 0, 0, 0);
// The text to draw
$text = 'Testing...';
// Replace path by your own font path
$font = 'arial.ttf';
// Add some shadow to the text
imagettftext($im, 20, 0, 11, 21, $grey, $font, $text);
// Add the text
imagettftext($im, 20, 0, 10, 20, $black, $font, $text);
// Using imagepng() results in clearer text compared with imagejpeg()
imagepng($im);
imagedestroy($im);
?>

This function requires both the GD library and the FreeType (http://www.freetype.org/) library.

emad86_20011
02-28-2006, 08:51 AM
ممنون آصف!! یکسری از چیزایی که گفتی تو این کتاب نبود:wacko: کامل کردی:)
فکر نمیکنم چیز خاصی دیگه ای مونده باشه!! بقدری کار با توابعش آسونه که جایی برای تو توضیح دادن نمیمونه!!
برای آشنایی با توابع دیگه هم میشه به سایت خود gd رفت که تمام توابع بطور کامل توضیح داده شده:rolleyes:

Asef
02-28-2006, 02:46 PM
بهترين كار اينه كه راهنماي كامل Php‌كه شامل سينتكس كامل توابع هم ميشه رو هميشه داشته باشيد. از همه مهم تر هم اينه كه همه كتاب هاي فارسي رو بريزي دور. وقت تلف كردنه

emad86_20011
03-01-2006, 08:30 AM
من از كتابا فقط اون اولي كه ميخوام با يه چيزي آشنا بشم استفاده ميكنم!! بقيه چيزا رو از تو اينترنت پيدا ميكنم:wink: حرفت هم تاييد ميشه!!

در ضمن راهنماي كامل php رو از كجا بگيرم؟:)

Asef
03-01-2006, 06:44 PM
اين نسخه تحت وب
http://www.php.net/manual/en

اينم براي دانلود
http://www.php.net/download-docs.php

emad86_20011
03-01-2006, 07:01 PM
اين نسخه تحت وب
http://www.php.net/manual/en

اينم براي دانلود
http://www.php.net/download-docs.php
مرسي!! اينو ديده بودم!! خيلي كامل و خوبه!!:)

Asef
03-01-2006, 07:40 PM
خواهش! مرجع php همينه ديگه! براي بحث هاي پيشرفته تر هم بهتره با اي بوك هايي كه هست خودتو سر گرم كني درجه بعد هم توي نت بگردي چيزاي خوبي گيرت مياد!