صفحه نخست
  • درباره من
  • نبی کرمعلی زاده
    • نام: نبي کرمعلي زاده
    • متولد: 1360/11/13
    • محل سکونت: اهواز
    • تحصيلات: مهندس آبياري
    • شغل: طراح وب و برنامه نويس
    • علايق: فقط کامپيوتر و دیگر هیچ !



  • آمار بازديد
    • تعداد آنلاین: 11
    • بازدید امروز: 276
    • بازدید دیروز: 933
    • بازدیـد کــل: 326974
    از تاريخ: 13 بهمن 1385



نوشتن بر روی تصویر توسط PHP
پنجشنبه 29 فروردین 1387 - 8:23:24 بعد از ظهر
Write On Picture With PHP

یکی از دوستان کد ساده ای را به زبان 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 باید نصب و فعال باشد.
  • برای نوشته ها یک حاشیه در نظر گرفته شده است، این حاشیه به نمایان بودن متن بر روی زمینه با هر رنگی کمک میکند. مثلاً نوشته سفید با حاشیه مشکلی، باعث میشود که نوشته هم بر روی زمینه سفید و هم روی زمینه مشکلی به خوبی مشاهده شود.
  • مصرف زیاد این کد در گالری های تصاویر است که بایستی کپی رایت سایت به صورت خودکار بر روی تصویر درج گردد. بهتر است از شفافیت مناسب برای نوشته بر روی تصویر استفاده کنید.

نمونه هایی از خروجی توسط این کلاس:

sample write on picture

[downloadدریافت سورس و مثالهای این کلاس]

ین کلاس در سایت phpclasses (امتیاز فراموش نشه ;-) ]

مشکلی بود در نظرات همین پست بفرمائید در خدمت هستم.

+ تاريخ آخرين ويرايش: يکشنبه 1 اردیبهشت 1387 - 12:26:21 بعد از ظهر


» 19 نظر برای این مطلب ارسال شده است. [نظر خود را ارسال کنيد]
  1. mohsentabib@gmail.com  tabib_m
    سلام
    همه چیش خوبه. فقط کاشکی از فونت های ttf استفاده میکردی!
    منظورم imagettftext هست. یک سری فونت قشنگ هم اگر بذاری کنارش، دیگه تکمیل میشه :)

    البته اگر بتونی روی فارسی سازیش هم کار کنی خوبه.
    این میتونه کمکت کنه:
    http://oxygenws.com/blog/archives/63-persian_log2vis-RC3.html

    موفق باشی

    ( راستی، تو هم با این باکس کامنتت! آدمو کلافه میکنه :) )
    جمعه 30 فروردین 1387 - 12:38:32 قبل از ظهر
  2. http://oxygenws.com/  امید
    خسته نباشید، بسیار عالی :)

    پ.ن: اگر خواستی فونت بذاری، مراقب باش فونت کپی‌رایت دار نذاری :D

    جمعه 30 فروردین 1387 - 1:11:30 قبل از ظهر
  3. http://weblog.4reh.com  فرحان
    نبي دستت درد نكنه خيلي بدرد بخوره.
    جمعه 30 فروردین 1387 - 11:06:01 بعد از ظهر
  4. nabikaz2001_se@yahoo.com http://weblog.nabi.ir  نبی
    @طبيب: به فکر خودم هم رسيده بود، ولي فونت هاي عمومي عرض يکساني ندارند به همين خاطر کار رو کمي مشکل ميکنه، چون عرض باکسي که نوشته بايد در اون نوشته بشه تا با عکس marge بشه رو نميشه پيدا کرد و مشکل از همينجا شروع ميشه. حالا ايشااله نسخه2 ;-)
    در مورد فارسي نوشتن هم فکر ميکنم اين مسئله به کلاس من مربوط نباشه و مربوط به php ميشه که افزونه فارسي آقا اميد روش نصب شده باشه يا نه.
    پ.ن: اينقدر غر نزدن، خيلي هم خوشگله :-D نخواستي ميتوني توي نوت پد بنويسي... البته فکرهايي براش دارم ولي کو تا به عمل تبديل بشه ;-)

    @اميد: ديگه استاد اميد تائيد بفرمايند چه شود، آدم خر کيف ميشود! گرچه ميدونم فقط خواسته اميدواري بده ;-)
    پ.ن: ديگه اسم کپي رايت رو با احتياط به زبون ميارم! دليلش رو در پست قبلي مفصل نوشتم.

    @فرحان: خواهش میکنم.
    شنبه 31 فروردین 1387 - 11:19:58 قبل از ظهر
  5. mohsentabib@gmail.com  tabib_m
    :D
    غلط کردم بابا، غر کجا بود! فکر کنم راحتترم که دیگه کامنت ننویسم :D
    ولی مگه تو میذاری؟ آدم حسش میگیره کامنت بزنه! :D
    شنبه 31 فروردین 1387 - 5:23:21 بعد از ظهر
  6. http://oxygenws.com/  امید
    خواهش می‌شود، این چه صحبتی است :) به هر حال، هر حرکت مثبتی، قابل تقدیره :)

    موفق باشید و پایدار و بازمتن.

    پ.ن: واقعا برام جالبه که اکثر دوستان مایکروسافتی این شعور رو ندارند که سورس حداقل برنامه‌هایی که سودی براشون نداره رو منتشر کنند!
    «نه خود خورد، نه کس دهد / گـَنده کند، مگش دهد!»
    شنبه 31 فروردین 1387 - 8:06:49 بعد از ظهر
  7. jimi_mcalister@yahoo.com  جيمي
    خيلي خوب!!
    يکشنبه 6 مرداد 1387 - 9:35:05 قبل از ظهر
  8.  دريا
    براي پيدا كردن شماره داوطلبي وكارنامه آزمون از نرم افزار شما غير فعال است بايد چي كار كنيم
    يکشنبه 17 شهریور 1387 - 12:44:53 قبل از ظهر
  9. mohamad@fathi.com  محمد فتحي زاده
    خيلي بي معرفتي ژسر عمه
    دوشنبه 26 اسفند 1387 - 12:57:09 قبل از ظهر
  10. mohamad@fathi.com  محمد فتحي زاده
    آي ديم عوض شده 11 به جاي99
    دوشنبه 26 اسفند 1387 - 12:58:23 قبل از ظهر
  11. http://www.always-in-allways.blogfa.com  متين
    سلام.بهتون خسته نباشيد ميگم.راستش من براي پروم كه زيادم وقت ندارم بايد طراحي سايت با جوملا كار كنم.ميتونم از شما كمك بگيرم؟
    دوشنبه 1 تیر 1388 - 7:47:00 بعد از ظهر
  12. http://weblog.nabi.ir  نبی
    @متين:
    ممنون. خوشحال میشم اگر کمکی از دستم بر بیاد انجام بدم.
    پنجشنبه 4 تیر 1388 - 6:28:00 قبل از ظهر
  13. norozzad@gmail.com http://www.norozzad.wordpress.com  محمد
    سلام و هسته نباشي
    مي خواستم بدونم مي شه اين فايل رو روي وردپرس فارسي نصب كرد كه وقتي مي خوام مطلب ارسال كنم توي آپلود عكس بشه از اين فايل استفاده كرد...؟
    ممنون و يا حق...
    شنبه 13 تیر 1388 - 9:00:56 بعد از ظهر
  14. http://weblog.nabi.ir  نبی
    @محمد:
    اگر منظورتون این باشه که وقتی عکسی رو آپلود میکنید، نوشته مشخص روی عکستون نوشته بشه، باید عرض کنم که این سورس یه کد کلیه و برای هر منظوری میشه استفاده کرد. اما برای اینکه روی وردپرس به اون شکلی که شما میخواهید قابل بهره برداری باشه، طبیعیه که باید اون رو به صورت یک پلاگین در آورد تا روی ورد پرس نصب بشه.
    شنبه 13 تیر 1388 - 11:03:13 بعد از ظهر
  15. http://www.hotscripts.ir  هات اسکریپت
    http://www.hotscripts.ir/paper_show.php?id=41
    دوشنبه 12 مرداد 1388 - 12:44:19 قبل از ظهر
  16. siavash.m@yahoo.com  سياوش
    سلام من چيكار كنم كه آپلودسنتر عكسم بتونه روي عكس هايي كه آپلود ميكنه نوشته ايجاد كنه
    آپلود سنترم به اين شكله
    http://up.iranblog.com/
    دوشنبه 23 آذر 1388 - 2:29:07 قبل از ظهر
  17. http://weblog.nabi.ir  نبی
    @هات اسکریپت:
    از شما ممنونم.

    @سياوش:
    عزیزم پس تا حالا گل لگد میکردم؟ ;-)
    سه شنبه 24 آذر 1388 - 3:47:07 بعد از ظهر
  18. pirikliartan@gmail.com http://www.pirik.webs.com  پيريكلي
    سلام برادر نبي من بار اول است كه مي خواهم از اين كلاس استفاده كنم و هيچي راجع بهش نمي دونم.مي تونيد براي مبتدي هايي مثل من توضيح بيشتري بدهيد؟ممنون ميشم
    چهارشنبه 16 دی 1388 - 6:09:41 بعد از ظهر
  19. http://weblog.nabi.ir  نبی
    @پيريكلي:
    خواهش میکنم. البته که میشه.
    فقط فکر میکنم توضیحاتم خیلی ساده بود و از این ساده تر نمیشد. اما شما اگر جای خاصی از اون مشکل دارید، دقیق تر بگید کجاش، شاید من بتونم راهنمایی کنم.
    شنبه 19 دی 1388 - 2:51:25 قبل از ظهر
ارسال نظر
نام:
ایمیل:
وب سایت:
نظر شما:
کد امنيتي:
  کد امنيتي را وارد نمائيد