بروز رسانی : حل مشکل تبدیل متن فارسی به عکس در php + راستچین شدن حروف
در بعضی مواقع ، نیاز داریم که یک عکس داینامیک ایجاد کنیم ودر پروژه های تحت وب متن دلخواه را بر روی عکس بنویسیم. اگر شما نیاز به همچین قابلیتی دارید نگران نباشید در مقاله تبدیل متن به عکس در php نحوه ساخت و ذخیره آن در فرمت های JPG یا PNG آموزش می دهیم. در این آموزش ، به شما راحترین راه برای ساخت عکس از روی متن توسط php را نشان خواهیم داد.برای اینکار از یک کلاس PHP برای ساخت عکس و اضافه کردن خطوط مختلف به تصویر استفاده می کنیم کتابخانه GD برای ساخت و دستکاری فایل های عکس در php مورد استفاده قرار میگیرد .پس قبل از هرکاری مطمین باشید که PHP GD بر روی سرور شما نصب شده باشد.(بر روی بیشتر سرورهای هاستینگ ها و ابزار های راه انداز سرور لوکال این مورد نصب است !)
کلاس TextToImage
کلاس TextToImage در php به ما این امکان را می دهد که یک عکس را بسازیم و متن دلخواه را به آن اضافه کنیم کلاس TextToImage دارای ۴ تابع است که در زیر توضیح داده شده
- createImage() – ساخت عکس از روی متن . رشته متن باید به عنوان ورودی به تابع داده شود . همچنین میتوانید اندازه فونت و ابعاد (طول و عرض ) را مشخص کنید
- showImage() – عکس ساخته شده توسط تابع createImage() را return میکند.
- saveAsPng() – عکس را در فرمت .png ذخیره میکند . می توانید اسم فایل و محل ذخیره سازی را مشخص کنید .
- saveAsJpg() – عکس را در فرمت .jpg ذخیره میکند . می توانید اسم فایل و محل ذخیره سازی را مشخص کنید .
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 |
<?php /** * TextToImage class * This class converts text to image * * @author NetParadis Dev Team * @link http://www.netparadis.com */ class TextToImage { private $img; /** * Create image from text * @param string text to convert into image * @param int font size of text * @param int width of the image * @param int height of the image */ function createImage($text, $fontSize = 20, $imgWidth = 400, $imgHeight = 80){ //text font path $font = 'fonts/B_Yekaan.ttf'; //create the image $this->img = imagecreatetruecolor($imgWidth, $imgHeight); //create some colors $white = imagecolorallocate($this->img, 255, 255, 255); $grey = imagecolorallocate($this->img, 128, 128, 128); $black = imagecolorallocate($this->img, 0, 0, 0); imagefilledrectangle($this->img, 0, 0, $imgWidth - 1, $imgHeight - 1, $white); //break lines $splitText = explode ( "\\n" , $text ); $lines = count($splitText); foreach($splitText as $txt){ $textBox = imagettfbbox($fontSize,$angle,$font,$txt); $textWidth = abs(max($textBox[2], $textBox[4])); $textHeight = abs(max($textBox[5], $textBox[7])); $x = (imagesx($this->img) - $textWidth)/2; $y = ((imagesy($this->img) + $textHeight)/2)-($lines-2)*$textHeight; $lines = $lines-1; //add some shadow to the text imagettftext($this->img, $fontSize, $angle, $x, $y, $grey, $font, $txt); //add the text imagettftext($this->img, $fontSize, $angle, $x, $y, $black, $font, $txt); } return true; } /** * Display image */ function showImage(){ header('Content-Type: image/png'); return imagepng($this->img); } /** * Save image as png format * @param string file name to save * @param string location to save image file */ function saveAsPng($fileName = 'text-image', $location = ''){ $fileName = $fileName.".png"; $fileName = !empty($location)?$location.$fileName:$fileName; return imagepng($this->img, $fileName); } /** * Save image as jpg format * @param string file name to save * @param string location to save image file */ function saveAsJpg($fileName = 'text-image', $location = ''){ $fileName = $fileName.".jpg"; $fileName = !empty($location)?$location.$fileName:$fileName; return imagejpeg($this->img, $fileName); } } |
تبدیل متن به عکس در php
فایل TextToImage.php (کلاس TextToImage) را اینکلود و یک آبجکت (نمونه) از آن را می سازیم . تابع createImage() را فراخوانی و رشته متنی را به تابع پاس میدیم. اگر قصد اضافه کردن چنید خط را داشتید ، قبل از خط جدید “\n” را اضافه کنید
1 2 3 4 5 6 7 8 9 |
//include TextToImage class require_once 'TextToImage.php'; //create img object $img = new TextToImage; //create image from text $text = 'Welcome to NetParadis.\nThe World of Programming.'; $img->createImage($text); |
برای نمایش عکس از تابع showImage() استفاده میکنیم
1 2 |
//display image $img->showImage(); |
برای ذخیره سازی عکس در فرمت های Png یا JPG از تابع saveAsPng() یا SaveAsJpg() استفاده میکنیم . اگر نام فایل خروجی و مکان ذخیره سازی را مشخص نکنید ، عکس با اسم همان دایرکتری که اسکریپت را اجرا کردید ذخیره خواهد شد.
1 2 3 4 5 |
//save image as png format $img->saveAsPng('netparadis-text-to-image','images/'); //save image as jpg format $img->saveAsJpg('netparadis-text-to-image','images/'); |
تبدیل متن فارسی به عکس در php
همانطور که می بینید کلاس و کد های بالا برای تبدیل متن انگلیسی به عکس هیچ مشکلی ندارد
ولی در تبدیل متن فارسی به عکس در php با کد های بالا به مشکلاتی مثل برعکس شدن حروف ، جدا نوشته شدن و مشکلات دیگر بر میخورید که مشکل اصلی به خاطر دیتاهای unicode است .
برای حل مشکل یک روش جایگزین دیگر برای تبدیل متن فارسی به عکس در php معرفی کردیم :
ساختار فایل های پروژه تبدیل متن فارسی به عکس در php
- /fonts
- bidi.php
- persian_txt2pic.php
- unicode_data.php
- index.php
برای دانلود پروژه تبدیل متن فارسی به عکس در php کلیک کنید
بعد از اکسترکت کردن ، فایل index.php را اجرا و متن خود را وارد و خروجی عکس را تحویل بگیرید
برای تغییر اندازه عکس ، فونت ها ، رنگ پس زمینه و رنگ متن فایل index.php را ویرایش کنید
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
<?php require_once('persian_txt2pic.php'); if(!isset($_GET['submit'])){ echo '<html dir="rtl"> <head><title>Persian_log2vis Example</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head><body> <form method="get"> <textarea name="text">تیم برنامه نویسی نت پارادیس</textarea> <input type="submit" name="submit" value="submit"> </body></html>'; }else{ $text = $_GET['text']; persian_log2vis($text); // Create the image $im = imagecreatetruecolor(400, 200); // Create some colors $white = imagecolorallocate($im, 255, 255, 255); $black = imagecolorallocate($im, 0, 0, 0); // Replace path by your own font path $font = 'fonts/DejaVuSans.ttf'; // Add the text @imagettftext($im, 20, 0, 10, 30, $white, $font, $text); // Set the content-type header("Content-type: image/png"); // Using imagepng() results in clearer text compared with imagejpeg() imagepng($im); imagedestroy($im); } ?> |
خب همانطور که متوجه شدید direction حروف به صورت left to Right یعنی راست به چپ است . برای حل این مشکل از تابع imagettfbbox برای دریافت عرض متن استفاده می کنیم و بعد آن را از عرض خود عکس کم می کنیم تا مقدار مابه التفاوت را به عنوان فاصله متن از سمت چپ در نظر گرفتیم که باعث شد متن فارسی ما از سمت راست شروع شود.
کد اصلاحی راستچین کردن تبدیل متن فارسی به عکس در php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
<?php require_once('persian_txt2pic.php'); if(!isset($_GET['submit'])){ echo '<html dir="rtl"> <head><title>Persian_log2vis Example</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> </head><body> <form method="get"> <textarea name="text">تیم برنامه نویسی نت پارادیس</textarea> <input type="submit" name="submit" value="submit"> </body></html>'; }else{ $text = $_GET['text']; persian_log2vis($text); // Replace path by your own font path $font = 'fonts/DejaVuSans.ttf'; // Create the image $im = imagecreatetruecolor(400, 200); // Create some colors $white = imagecolorallocate($im, 255, 255, 255); $black = imagecolorallocate($im, 0, 0, 0); $dimensions = imagettfbbox(20, @$angle, $font, $text); $textWidth = abs($dimensions[4] - $dimensions[0]); $imgWidth = imagesx($im) - $textWidth; // Add the text @imagettftext($im, 20, 0, $imgWidth-20, 30, $white, $font, $text); // Set the content-type header("Content-type: image/png"); // Using imagepng() results in clearer text compared with imagejpeg() imagepng($im); imagedestroy($im); } ?> |
برای صحیح کپی شدن کدهای php بر روی کدها دابل کلیک کنید تا وارد محیط سفید و کپی کنید در غیراینصورت امکان دارد اجرای کدها با مشکل روبرو شود .
برای نوشتن متن به صورت چند خطی از تابع wordwrap به اینصورت بعد از دریافت متن و ذخیره آن در یک متغییر به اینصورت استفاده کنید
1 2 3 4 5 6 |
..... }else{ $text = $_GET['text']; $text = wordwrap($text, 45, "\n"); .... |
عدد ۴۵ به این معنی است که هر خط شامل چند حرف یا کاراکتر باشد .
جمع بندی
کلاس TextToImage به طور پیش فرض از فونت b Yekaan برای متن استفاده می کند. اگر خواستید فونت پیش فرض را تغییر بدید کافیست فونت مورد نظر را در دایرکتری fonts/ قرار بدید و آدرس را به تابع createImage($font) پاس بدید امیدوارم از آموزش تبدیل متن به عکس در php لذت برده باشید . موفق باشید.
سلام ، من قطعه کد های شما را قرار دادم
اما ماسفانه تصویری که درست شد در آن هیچ متنی نیست.
مشکل و ایراد کار از کجا است؟
سلام.
احتمالا ورژن php شماست که بالا یا پایین کنید اوکی میشه
سلام ، وقتی فونت مورد نظرمو جایگزین میکنم تو تایپ لاتین درست نمایش میده ولی تو تایپ فارسی چیزی نشون میده ، با اینکه فونت هم فارسی هست
سلام.
این کتابخانه رو چک کنید :
https://github.com/mahmoud-eskandari/PersianRender
سلام ممنون از آموزش ، بنده فقط در تغییر فونت مشکل دارم ، فونت دلخواهمو آپلود کردم ولی تو خروجی هیچی نشون نمیده ، مشکل از کجاست ؟
سلام. خوشحالیم که مفید واقع شده.
بعد آپلود باید آدرس و اسمش رو هم داخل فایل php بروز کنید
بله اینکارو کردم ، وقتی آدرس رو همون فونت پیش فرض dejavu هست خروجی رو نشون میده ولی وقتی آدرس رو تغییر میدم به فونتی که آپلود کردم نشون نمیده چیزی ، فونتی بنده آپلود کردم kalameh-black هست …
سلام. احتمالا کش کرده باید کش رو حذف و مجدد تست کنید
نه مشکل از خوده فونت بود ، این فونتو من تو html css استفاده کردم و مشکلی نداشت اما تو php فقط رو حالت انگلیسی نشون میداد . بعد یه فونتی که درست کار میکردو با فونت کریتور ادیت کردم و تک تک کاراکترای حروفو از رو اون فونتی که میخواستم کپی پیس کردم تا مشکل حل شد 😐😃
سلام ممنون از پاسخون اما من فایل php رو هم ویرایش کردم و اسمشو هم تغییر دادم ولی بعد از تغییر اسم خروجی چیزی نمایش داده نمیشه ، ولی روی همون فونت پیش فرض اوکیه و کار میکنه …
سلام
من برنامه رو گزاشتم داخل هاستم ولی ارور میده
Fatal error: Array and string offset access syntax with curly braces is no longer supported in E:\xampp\htdocs\Persian-txt2img-netparadis\Persian-txt2img\bidi.php on line 70
چیکار کنم؟؟
سلام. احتمالا به خاطر ورژن php شماست ورژن رو بالا پایین کنید و تست کنید
و یه سوال دیگه امکانش هست ما یه متن رو با استفاده از css استایل دهی کنیم و روی یک عکس با پس زمینه شفاف قرار دهیم و خروجی را تبدیل به png بازهم با پس زمینه شفاف کرد ؟؟ اگر اموزشی هم در این رابطه معرفی کنید ممنون میشم
سلام. از این کتابحانه که امکانات فراوان از جمله قابلیت هایی که نیاز دارید استفاده کنید :
https://github.com/kus/php-image
موفق باشید.
سلام چطوری میشه با php یه متن رو با شرایط زیر روی عکس اضافه کرد؟
– مختصات متن ثابت باشه یعنی wight و hight ثابت باشه
– با توجه به تعداد کاراکتر متن سایز متن تغییر کنه
منظورم اینه ما محل نوشتن متن رو مرکز تصویر قرار بدیم و اگه متن کاراکترهاش زیاد بود از صفحه نزنه بیرون و فقط سایز فونت کم بشه که متن کامل داخل عکس قرار بگیره اگر اموزشی در این مورد معرفی کنید ممنون میشم
سلام واسه منم یک صفحه سیاه رنگ میاد و الان پی اچ پی ورژن ۷٫۰ اومده ، چجوری استفاده کنم از این کدها؟؟؟؟لطفا جواب بدید خیلی نیاز دارم کدهارو…
سلام. لطفا روی ورژن ۵٫۶ تست و نتیجه رو اعلام کنید. همچنین سورس کامل که در باکس دانلود است را دریافت و دقیقا همان را استفاده کنید.
موفق باشید.
اول ممنون بابت اینک سریع جواب دادید ، بله به درستی کار میکنه روی ورژن ۵٫۶ و خیلیم عالی و تمیز هست کد ، فقط راه حلی واسه ورژن های بالاتر ندارید؟؟ آخه دیگه کسی از ورژن های پایین استفاده نمیکنه…
سلام. خوشحالیم که مفید واقع شده
چشم حتما روی ورژن جدید تست و ویرایش و بعد اطلاع رسانی میشه که استفاده کنید.
موفق باشید.
سلام.. چطوری میشه چندین متغیر رو به یه عکس چسبوند؟
با تشکر از آموزشای خوبتون
سلام. اگر درست متوجه شده باشم نیاز است که مقادیر متغییر ها را داخل ” و داخل متغیر $text قرار بدید
به اینصورت :
$text = ” $name fa Name $fa “;
موفق باشید.
سلام عزیز.خسته نباشید.ببخشید من فایل تبدیل متن فارسی به عکس رو دانلود کردم و در ومپ اجرا کردم.وقتی متن رو وارد میکنم و submit رو میزنم ، فقط با یک صفحه سیاه رو به رو میشم.مشکلش چیه؟
سلام. ممنون.
به این معنی است که متن موردنظر روی تصویر چاپ نمی شود. سعی کنید از ورژن php 5.6 استفاده کنید.
موفق باشید.
سلام
می خواستم بدونم امکان این وجود داره که قسمتی از کد html رو مثلا یک div که شامل چند div دیگه است رو هم به صورت عکس خروجی داد؟
سلام.
بله هر رشته ای را می توانید به عکس تبدیل کنید.
موفق باشید.
سلام مجدد
یعنی فرمایش می فرمایید که در این قسمت
$text = ‘Welcome to NetParadis.\nThe World of Programming.’;
$img->createImage($text);
میشه یه div گذاشت و با همه css ها به عکس تبدیل میشه؟
سلام. لطفا این مورد را تست کنید تا نتیجه نهایی را ببینید.
موفق باشید.
سلام
بخوا م متن روی یه عکس باشه چیکار باید بکنم ؟
سلام. با ایده گرفتن از این آموزش می توانید متن دلخواه رو روی عکس قرار بدید
https://netparadis.com/create-captcha-in-php/
موفق باشید.
سلام خسته نباشید
یه راهنمایی می خواستم
آیا میشه پس رمینه بدون رنگ باشه یعنی transparnt؟
یا میشه مستقیم یه متن رو روی یک عکس انداخت؟یا اول باید متن به عکس تبدیل بشه بعد روی یک عکس دیگه گذاشته بشه؟
سلام . ممنون
بله می تونید از تابع
imagecolortransparent
استفاده کنید.برای واترمارک کردن هم از مقاله آموزشی واترمارک روی عکس php بهره ببرید.
موفق باشید.
سلام وقتی کد هارو جمع بندی کردیم و بعدش تو هاست آپلود کردیم چطور استفاده کنیم
میشه به صورت مثال بگید
مثل
https://example.com/MatnbeAks.php
سلام . باید بصورت پارامتر GET از طریق URL متن خودتون رو وارد کنید.
موفق باشید.
مثلا
https://mrx.tele4uteam.ir/tests.php?submit=Text
بله به اینصورت باید متن رو پاس بدید .
با سلام
من از تابع استفاده کردم با فونت یکان بدون مشکل فقط متن من چند خطه و طول کاراکتر ها خطها متفاوت هست و از تابع wordwrap
هم استفاده کردم ولی مشکل اینه که بزرگترین خط از راست میشه و خطهای کوچکتر از وسط شروع میشه
در ضمن زمینه رو چطور سفید کنم تا بتونم متن سفید رو نمایش بدم
سلام . بله این مشکل جزئی با کاراکترهای چندخطی فارسی وحود داره .
برای تغییر رنگ پس زمینه این قسمت از کد را تغییر بدید
imagefilledrectangle($this->img, 0, 0, $imgWidth – 1, $imgHeight – 1, $white);
در پارامتر آخر به جای $white , متغییر $black را پاس بدید
موفق باشید.
سلام دوست عزیز
متن عشق رو به صورت ق ش ع مینویسه
نمیشه درست کرد؟
سلام فرهاد جان .
بله به خاطر مشکل دیتاهای یونیکد این مشکل به طور پیشفرض وجود داشت که راه حل رو ارایه دادیم و می تونید با خیال راحت از روش جایگزین استفاده کنید
موفق باشید
سلام
ممنون از تابع خوبتون
می خوام متن از سمت راست عکس نمایش داده بشه
تغیرات را هم اعمال کردم ولی نشد
سلام . خواهش می کنم . نباید مشکلی باشه همانطور که در عکس می بینید متن فارسی به راحتی راست به چب شده . باز هم اگر مشکلی بود کد رو قرار بدید تا بررسی بشه
موفق باشید