PDA

View Full Version : مشکل در چاپ لغات فارسی روی عکس



ali zi zeperto
یک شنبه 01 آبان 1390, 18:12 عصر
سلام.من کد زیر رو برای نمونه گذاشتم که مشکل رو ببینید.می خوام یه سری متن فارسی رو روی تصویری که دارم چاپ کنم.منتها همونطور که تو عکس می بینید درست چاپ نمیشه.یه مشکل هم هست که توی کد می بینید.اون هم لود کردن فایل فونت هست.به نظر شما آیا این طور آدرس دادن درسته؟راه بهتری اگر هست راهنمایی کنید.

$img = ImageCreate(290,141);
$yallow = imagecolorallocate($img, 204, 217, 2);
$black = imagecolorallocate($img, 0, 0, 0);
$font = 'c:/windows/fonts/tahoma.ttf';
$text = 'موفق باشی';
imagettftext($img, 20, 0, 11, 21, $black, $font, $text);
ImagePng($img,'result.png');

این هم خروجیش
76965

rezakho
یک شنبه 01 آبان 1390, 23:36 عصر
این مشکل هنوز در PHP GD به صورت ریشه ای حل نشده و یک باگه، ولی خوب راه هایی برای حلش وجود داره

یه مشکل هم هست که توی کد می بینید.اون هم لود کردن فایل فونت هست.به نظر شما آیا این طور آدرس دادن درسته؟راه بهتری اگر هست راهنمایی کنید.
در این مورد می تونی فونت مورد نظر رو کنار فایل PHP قرار بدی و فقط بنویسی

$font = 'tahoma.ttf';
و اما راه حل مشکل اصلی :)
کدهای زیر را داخل فایلی با نام fagd.php بگذار
توابع داخل این فایل کاراکتر های فارسی را با نوع وسط و ... جا به جا می کنند و مشکل حل میشه :)

fagd.php


<?php

// Author: Milad Rastian

function utf8_strlen($str)
{
return preg_match_all('/[\x00-\x7F\xC0-\xFD]/', $str, $dummy);
}

$p_chars = array (
'آ' => array ('ﺂ', 'ﺂ', 'آ'),
'ا' => array ('ﺎ', 'ﺎ', 'ا'),
'ب' => array ('ﺐ', 'ﺒ', 'ﺑ'),
'پ' => array ('ﭗ', 'ﭙ', 'ﭘ'),
'ت' => array ('ﺖ', 'ﺘ', 'ﺗ'),
'ث' => array ('ﺚ', 'ﺜ', 'ﺛ'),
'ج' => array ('ﺞ', 'ﺠ', 'ﺟ'),
'چ' => array ('ﭻ', 'ﭽ', 'ﭼ'),
'ح' => array ('ﺢ', 'ﺤ', 'ﺣ'),
'خ' => array ('ﺦ', 'ﺨ', 'ﺧ'),
'د' => array ('ﺪ', 'ﺪ', 'ﺩ'),
'ذ' => array ('ﺬ', 'ﺬ', 'ﺫ'),
'ر' => array ('ﺮ', 'ﺮ', 'ﺭ'),
'ز' => array ('ﺰ', 'ﺰ', 'ﺯ'),
'ژ' => array ('ﮋ', 'ﮋ', 'ﮊ'),
'س' => array ('ﺲ', 'ﺴ', 'ﺳ'),
'ش' => array ('ﺶ', 'ﺸ', 'ﺷ'),
'ص' => array ('ﺺ', 'ﺼ', 'ﺻ'),
'ض' => array ('ﺾ', 'ﻀ', 'ﺿ'),
'ط' => array ('ﻂ', 'ﻄ', 'ﻃ'),
'ظ' => array ('ﻆ', 'ﻈ', 'ﻇ'),
'ع' => array ('ﻊ', 'ﻌ', 'ﻋ'),
'غ' => array ('ﻎ', 'ﻐ', 'ﻏ'),
'ف' => array ('ﻒ', 'ﻔ', 'ﻓ'),
'ق' => array ('ﻖ', 'ﻘ', 'ﻗ'),
'ک' => array ('ﻚ', 'ﻜ', 'ﻛ'),
'گ' => array ('ﮓ', 'ﮕ', 'ﮔ'),
'ل' => array ('ﻞ', 'ﻠ', 'ﻟ'),
'م' => array ('ﻢ', 'ﻤ', 'ﻣ'),
'ن' => array ('ﻦ', 'ﻨ', 'ﻧ'),
'و' => array ('ﻮ', 'ﻮ', 'ﻭ'),
'ی' => array ('ﯽ', 'ﯿ', 'ﯾ'),
'ك' => array ('ﻚ', 'ﻜ', 'ﻛ'),
'ي' => array ('ﻲ', 'ﻴ', 'ﻳ'),
'أ' => array ('ﺄ', 'ﺄ', 'ﺃ'),
'ؤ' => array ('ﺆ', 'ﺆ', 'ﺅ'),
'إ' => array ('ﺈ', 'ﺈ', 'ﺇ'),
'ئ' => array ('ﺊ', 'ﺌ', 'ﺋ'),
'ة' => array ('ﺔ', 'ﺘ', 'ﺗ')
);

$nastaligh = array(
'ه' => array ('ﮫ', 'ﮭ', 'ﮬ')
);

$normal = array(
'ه' => array ('ﻪ', 'ﻬ', 'ﻫ')
);

$mp_chars = array ('آ', 'ا', 'د', 'ذ', 'ر', 'ز', 'ژ', 'و', 'أ', 'إ', 'ؤ');

$ignorelist = array('','ٌ','ٍ','ً','ُ','ِ','َ','ّ','ٓ',' ٰ','ٔ','ﹶ','ﹺ','ﹸ','ﹼ','ﹾ','ﹴ','ﹰ' ,'ﱞ','ﱟ','ﱠ','ﱡ','ﱢ','ﱣ',);

function fagd($str, $z="", $method='normal')
{
global $p_chars, $mp_chars, $ignorelist, $nastaligh, $normal;

if($method == 'nastaligh')
$p_chars = array_merge($p_chars,$nastaligh);
else
$p_chars = array_merge($p_chars,$normal);

$str_len = utf8_strlen($str);

preg_match_all("/./u", $str, $ar);

for ($i=0; $i<$str_len; $i++)
{
$str1 = $ar[0][$i];

if(in_array($ar[0][$i+1], $ignorelist))
{
$str_next = $ar[0][$i+2];
if($i == 2) $str_back = $ar[0][$i-2];
if($i != 2) $str_back = $ar[0][$i-1];
}
elseif(!in_array($ar[0][$i-1], $ignorelist))
{
$str_next = $ar[0][$i+1];
if($i != 0) $str_back = $ar[0][$i-1];
}
else
{
if(isset($ar[0][$i+1]) && !empty($ar[0][$i+1]))
$str_next = $ar[0][$i+1];
else
$str_next = $ar[0][$i-1];

if($i != 0) $str_back = $ar[0][$i-2];
}

if(!in_array($str1, $ignorelist))
{
if (array_key_exists($str1, $p_chars))
{
if(!$str_back or $str_back == " " or !array_key_exists($str_back, $p_chars))
{
if(!array_key_exists($str_back,$p_chars) and !array_key_exists($str_next, $p_chars))
$output = $str1 . $output;
else
$output = $p_chars[$str1][2] . $output;

continue;
}
elseif(array_key_exists($str_next,$p_chars) and array_key_exists($str_back,$p_chars))
{
if(in_array($str_back, $mp_chars) and array_key_exists($str_next, $p_chars))
$output = $p_chars[$str1][2] . $output;
else
$output = $p_chars[$str1][1] . $output;

continue;
}
elseif(array_key_exists($str_back, $p_chars) and !array_key_exists($str_next, $p_chars))
{
if(in_array($str_back, $mp_chars))
$output = $str1 . $output;
else
$output = $p_chars[$str1][0] . $output;

continue;
}
}
elseif($z == "fa")
{
$number = array("٠","١","٢","٣","٤","٥","٦","٧","٨","٩","۴","۵","۶","0","1","2","3","4","5","6","7","8","9");
switch ($str1)
{
case ")" : $str1="("; break;
case "(" : $str1=")"; break;
case "}" : $str1="{"; break;
case "{" : $str1="}"; break;
case "]" : $str1="["; break;
case "[" : $str1="]"; break;
case ">" : $str1="<"; break;
case "<" : $str1=">"; break;
}

if(in_array($str1, $number))
{
$num .= $str1;
$str1 = "";
}

if (!in_array($str_next, $number))
{
$str1 .= $num;
$num = "";
}

$output = $str1 . $output;
}
else
{
if(($str1 == "،") or ($str1 == "؟") or ($str1 == "ء") or (array_key_exists($str_next, $p_chars) and array_key_exists($str_back, $p_chars)) or ($str1 == " " and array_key_exists($str_back,$p_chars)) or ($str1 == " " and array_key_exists($str_next,$p_chars)))
{
if($e_output)
{
$output = $e_output . $output;
$e_output = "";
}

$output = $str1 . $output;
}
else
{
$e_output .= $str1;
if(array_key_exists($str_next, $p_chars) or $str_next == "")
{
$output = $e_output . $output;
$e_output = "";
}
}
}
}
else
$output = $str1 . $output;

$str_next = null;
$str_back = null;
}

return $output;
}

?>


خوب، حالا میتونی از فایل بالا مثل زیر استفاده کنی :)


<?php

error_reporting("E_ALL");

header("Content-Type: image/png");

include("fagd.php");

$path = "vvolf.png";

$text = "وولف دات نت";

$image = imagecreatefrompng($path);

$black = imagecolorallocate($image, 0, 0, 0);

$text = fagd($text, 'fa', 'nastaligh');

$font = 'Nastaligh.ttf';

imagettftext($image, 17, 0, 5, 160, $black, $font, $text);

imagepng($image);

imagedestroy($image);

?>

تذکر : فروم بعضی جاها کدها رو خراب می کنه، یعنی فاصله اضافی ایجاد میکنه، مراقب باشید :(
موفق باشید :)