
یکی از دوستان کد ساده ای را به زبان PHP خواستند که توسط آن، جمله ای بر روی عکس نوشته شود؛ به همین خاطر چون فکر کردم جنبه کاربردی زیادی دارد، یک کلاس کامل برای این منظور نوشتم که امیدوارم مورد استفاده قرار بگیرد. از جمله قابلیت های این کلاس، تراز کردن موقعیت قرارگیری متن بر روی تصویر، درج حاشیه (Border)، تعیین شفافیت (Opacity) نوشته و پشتیبانی از انواع فورمت های ورودی و خروجی می باشد.
در ادمه سورس کد این کلاس را بررسی میکنیم.
متن کلاس بدین صورت است: (نام فایل write_on_pic.class.php)
<?php /** * This class is a writer on picture * * @package Write on picture * @author Nabi KaramAliZadeh <info [at] nabi [dot] ir> * @copyright 2008 (c) Nabi.ir * @license http://www.gnu.org/copyleft/gpl.html * @version 1.0.0 * @link http://weblog.nabi.ir/post-27.html [documentation in persian] * @since 12 April 2008 */ class Write_On_Pic { var $inputImage = ''; // input file name var $inputType = 'jpg'; // input file format: JPG, PNG, GIF, BMP var $outputImage = ''; // output file name var $outputType = 'png'; // output file format: JPG, PNG, GIF, BMP var $text = ''; // text to write on image var $fontSize = 5; // text size: 1,2,3,4,5 var $textColor = array(255, 255, 255); // text color: RGB decimal var $borderFlag = true; // flag of border: TRUE, FALSE var $borderColor = array(0, 0, 0); // border color: RGB decimal var $backFlag = false; // flag of background: TRUE, FALSE var $backColor = array(200, 200, 200); // background color: RGB decimal var $marginH = 0; // text horizonatal margin in pixels var $marginV = 0; // text vertical margin in pixels var $alignH = 'LEFT'; // text horizonatal position, LEFT | CENTER | RIGHT var $alignV = 'TOP'; // text vertical position, TOP | CENTER | BOTTOM var $quality = 85; // quality out file, only for JPG format var $opacity = 60; // text opacity: 0-100 var $show = true; // show image: TRUE, FALSE var $save = false; // save out file: TRUE, FALSE var $error = null; // return error message function Action() { // Set function to create image if (!$this->inputImage) { $this->error = 'Not found input file.'; return false; } switch (strtolower($this->inputType)) { case "png": $createFunc = "imagecreatefrompng"; break; case "gif"; $createFunc = "imagecreatefromgif"; break; case "bmp"; $createFunc = "imagecreatefrombmp"; break; case "jpeg": case "jpg": $createFunc = "imagecreatefromjpeg"; break; } // Create image $im = @$createFunc($this->inputImage); if (!$im) { $this->error = 'Invalid format file.'; return false; } // Create box $this->fontSize = intval($this->fontSize); if ($this->fontSize < 1) $this->fontSize = 1; if ($this->fontSize > 5) $this->fontSize = 5; $width = strlen($this->text) * ($this->fontSize + 4); $height = $this->fontSize + 12; $overlay_img = imagecreatetruecolor($width+2, $height+2); if ($this->backFlag) { $bgColor = imagecolorallocate($overlay_img, $this->backColor[0], $this->backColor[1], $this->backColor[2]); } else { $bgColor = imagecolortransparent($overlay_img); } imagefill($overlay_img ,0 ,0 ,$bgColor); // Insert border if ($this->borderFlag) { $color = imagecolorallocate($overlay_img, $this->borderColor[0], $this->borderColor[1], $this->borderColor[2]); imagestring($overlay_img, $this->fontSize, 0, 0, $this->text, $color); imagestring($overlay_img, $this->fontSize, 2, 2, $this->text, $color); imagestring($overlay_img, $this->fontSize, 2, 0, $this->text, $color); imagestring($overlay_img, $this->fontSize, 0, 2, $this->text, $color); } // Insert text $color = imagecolorallocate($overlay_img, $this->textColor[0], $this->textColor[1], $this->textColor[2]); imagestring($overlay_img, $this->fontSize, 1, 1, $this->text, $color); // Get width and height box $overlay_w = ImageSX($overlay_img); $overlay_h = ImageSY($overlay_img); // Get width and height image $im_w = ImageSX($im); $im_h = ImageSY($im); // Set X text switch (strtoupper($this->alignH)) { case 'CENTER': $x = ($im_w - $overlay_w) / 2; break; case 'RIGHT': $x = $im_w - $overlay_w - $this->marginH; break; case 'LEFT': $x = 0 + $this->marginH; break; } // Set Y text switch (strtoupper($this->alignV)) { case 'CENTER': $y = ($im_h - $overlay_h) / 2; break; case 'BOTTOM': $y = $im_h - $overlay_h - $this->marginV; break; case 'TOP': $y = 0 + $this->marginV; break; } // Merge text box with image imagecopymerge($im, $overlay_img, $x, $y, 0, 0, $overlay_w, $overlay_h, $this->opacity); // Destroy text box imagedestroy($overlay_img); // Save to disk if ($this->save) { if (!$this->outputImage) { $this->error = 'Not found output file.'; return false; } switch (strtolower($this->outputType)) { case "png": imagepng($im, $this->outputImage); break; case "gif"; imagegif($im, $this->outputImage); break; case "bmp"; imagewbmp($im, $this->outputImage); break; case "jpeg": case "jpg": imagejpeg($im, $this->outputImage, $this->quality); break; } } // Show the image if ($this->show) { switch ($this->outputType) { case "png": header("Content-type: image/png"); imagepng($im); break; case "gif"; header("Content-type: image/gif"); imagegif($im); break; case "bmp"; header("Content-type: image/bmp"); imagewbmp($im); break; case "jpeg": case "jpg": header("Content-type: image/jpeg"); imagejpeg($im, null, $this->quality); break; } } // Destroy image imagedestroy($im); return true; } } ?>
و این هم یک مثال: (نام فایل example.php)
<?php /** * This example is for writer on picture class * * @name Example write on picture * @author Nabi KaramAliZadeh <info [at] nabi [dot] ir> * @copyright 2008 (c) Nabi.ir * @license http://www.gnu.org/copyleft/gpl.html * @version 1.0.0 * @link http://weblog.nabi.ir/post-27.html [documentation in persian] * @since 12 April 2008 */ require_once ('write_on_pic.class.php'); $objWriter = new Write_On_Pic(); $objWriter->inputImage = 'aquarius.jpeg'; $objWriter->inputType = 'jpg'; $objWriter->outputImage = 'aquarius2.png'; $objWriter->outputType = 'png'; $objWriter->text = 'http://weblog.nabi.ir/'; $objWriter->fontSize = 5; $objWriter->textColor = array(255, 255, 255); $objWriter->borderFlag = true; $objWriter->borderColor = array(0, 0, 0); $objWriter->backFlag = true; $objWriter->backColor = array(255, 0, 0); $objWriter->marginH = 0; $objWriter->marginV = 170; $objWriter->alignH = 'CENTER'; $objWriter->alignV = 'BOTTOM'; $objWriter->quality = 90; $objWriter->opacity = 50; $objWriter->show = true; $objWriter->save = true; $return = $objWriter->Action(); if (!$return) { echo $objWriter->error; } ?>
فکر میکنم همه چیز واضح باشد با این حال توضیح مختصری عرض میکنم.
پس از الحاق فایل کلاس به صفحه، ابتدا یک شیء از کلاس Write_On_Pic با نام objWriter$ ایجاد میکنیم.
پارامترهایی که باید به این شیء نسبت دهیم بدین صورت می باشند:
- inputImage : نام و مسیر تصویر ورودی
- inputType : فورمت تصویر ورودی، که میتواند BMP, GIF, PNG, JPG باشد
- outputImage : نام و مسیر تصویر خروجی
- outputType : فورمت تصویر خروجی، که میتواند BMP, GIF, PNG, JPG باشد
- text : متنی که قصد دارید بر روی تصویر درج شود
- fontSize : اندازه فونت، عددی بین 1 تا 5
- textColor : رنگ فونت، یک آرایه که به ترتیب حاوی مقادیر سه رنگ اصلی قرمز، سبز، آبی در مبنای 10می باشد. عددی بین 1 تا 255
- borderFlag : مشخص کننده وجود یا عدم وجود حاشیه برای نوشته می باشد. TRUE یا FALSE
- borderColor : رنگ حاشیه، یک آرایه که به ترتیب حاوی مقادیر سه رنگ اصلی قرمز، سبز، آبی در مبنای 10می باشد. عددی بین 1 تا 255
- backFlag : مشخص کننده وجود یا عدم وجود زمینه برای نوشته می باشد. TRUE یا FALSE
- backColor : رنگ زمینه، یک آرایه که به ترتیب حاوی مقادیر سه رنگ اصلی قرمز، سبز، آبی در مبنای 10می باشد. عددی بین 1 تا 255
- marginH : حاشیه از لبه در محور افقی
- marginV : حاشیه از لبه در محور عمودی
- alignH : تراز کردن نوشته در راستای افق، یکی از مقادیر LEFT، CENTER، RIGHT
- alignV : تراز کردن نوشته در راستای عمود، یکی از مقادیر TOP، CENTER، BOTTOM
- quality : کیفیت تصویر خروجی که عددی بین 1 تا 100 است
- opacity : شفافیت نوشته روی تصویر خروجی، که عددی بین 1 تا 100 است
- show : با TRUE قرار دادن این پارامتر، تصویر در خروجی به نمایش در خواهد آمد
- save : با TRUE قرار دادن این پارامتر، تصویر تولیدی در قالب فایل جدیدی ذخیره می شود
پارامترهایی که مقدار دهی نشوند از مقدار پیشفرض آنها استفاده خواهد شد. نهایتاً پس از انتساب تمامی مقادیر، توسط متد ()Action عملیات آغاز میگردد و در انتها نیز کنترل خطا صورت میگیرد.
چند نکته:
- gd2 باید نصب و فعال باشد.
- برای نوشته ها یک حاشیه در نظر گرفته شده است، این حاشیه به نمایان بودن متن بر روی زمینه با هر رنگی کمک میکند. مثلاً نوشته سفید با حاشیه مشکلی، باعث میشود که نوشته هم بر روی زمینه سفید و هم روی زمینه مشکلی به خوبی مشاهده شود.
- مصرف زیاد این کد در گالری های تصاویر است که بایستی کپی رایت سایت به صورت خودکار بر روی تصویر درج گردد. بهتر است از شفافیت مناسب برای نوشته بر روی تصویر استفاده کنید.
نمونه هایی از خروجی توسط این کلاس:

[دریافت سورس و مثالهای
این کلاس]
[این کلاس در سایت phpclasses (امتیاز فراموش نشه ;-) ]
مشکلی بود در نظرات همین پست بفرمائید در خدمت هستم.
+ تاريخ آخرين ويرايش: يکشنبه 1 اردیبهشت 1387 - 7:56:21 قبل از ظهر