Если я хочу написать следующий текст на изображении:
दीक्षा शिक्षा क्या क्या हो गया!
Затем он не дает ожидаемого результата, а вместо этого печатает текст на картинке, как показано ниже. Я попробовал почти все шрифты devanagari ttf и unicode, доступные для хинди.
Вот код:
$quote="दीक्षा शिक्षा क्या क्या हो गया!"; imagettftext($new_pic, $fontsize, 0, 170, 155-$hidd/2, $color, $font, $quote);
Любая помощь будет очень оценена.
Спасибо и приветствую,
У меня такая же проблема и придумал решение в php с файлом managal.ttf.! используя этот код, ваш хинди-шрифт будет корректно отображаться в файле изображения.
$text = "की एक विधा" ; $words = explode(" ", $text); $words = explode(" ", $text); for($k = 0; $k < count($words); $k++){ // detect if the string was passed in as unicode $text_encoding = mb_detect_encoding($words[$k], 'UTF-8, ISO-8859-1'); // make sure it's in unicode if ($text_encoding != 'UTF-8') { $words[$k] = mb_convert_encoding($words[$k], 'UTF-8', $text_encoding); } // html numerically-escape everything (&#[dec];) $words[$k] = mb_encode_numericentity($words[$k], array (0x0, 0xffff, 0, 0xffff), 'UTF-8'); $arr = explode("&#", $words[$k]); for ($i = 0; $i < (count($arr)-1); $i++){ // interchange the order of "i" vowel if($arr[$i] == "2367;") { $arr[$i] = $arr[$i-1] . ''; $arr[$i-1] = "2367;"; } // letter "I" + Nukta forms letter vocalic "L" if($arr[$i] == "2311;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2316;"; $arr[$i+1] = ''; } } // vowel sign vocalic "R" + sign Nukta forms vowel sign vocalic "Rr" if($arr[$i] == "2371;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2372;"; $arr[$i+1] = ''; } } // Candrabindu + sign Nukta forms Om if($arr[$i] == "2305;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2384;"; $arr[$i+1] = ''; } } // letter vocalic "R" + sign Nukta forms letter vocalic "Rr" if($arr[$i] == "2315;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2400;"; $arr[$i+1] = ''; } } // letter "Ii" + sign Nukta forms letter vocalic "LI" if($arr[$i] == "2312;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2401;"; $arr[$i+1] = ''; } } // vowel sign "I" + sign Nukta forms vowel sign vocalic "L" if($arr[$i] == "2367;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2402;"; $arr[$i+1] = ''; } } // vowel sign "Ii" + sign Nukta forms vowel sign vocalic "LI" if($arr[$i] == "2368;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2403;"; $arr[$i+1] = ''; } } // Danda + sign Nukta forms sign Avagraha if($arr[$i] == "2404;") { if($arr[$i+1] == "2364;") { $arr[$i] = "2365;"; $arr[$i+1] = ''; } } // consonant + Halant + Halant + consonant forms consonant + Halant + ZWNJ + consonant if($arr[$i] == "2381;") { if($arr[$i+1] == "2381;") { //$arr[$i+1] = '8204;'; } } // consonant + Halant + Nukta + consonant forms consonant + Halant + ZWJ + Consonant if($arr[$i] == "2364;") { if($arr[$i+1] == "2381;") { //$arr[$i] = "2381;"; //$arr[$i+1] = '8205;'; } } } $words[$k] = implode('&#',$arr); } $text = implode(" ", $words); $img_name = date('dmyhms'); $image = $img_name.'.png'; if(file_exists($imagefile)){ /*** create image ***/ $im = @imagecreatefrompng($imagefile); /*** create the text color ***/ $text_color = imagecolorallocate($im, 40, 50, 99); /*** set the font file ***/ $font_file = 'mangal.ttf'; // Convert HTML entities into ISO-8859-1 // $text = html_entity_decode($text,ENT_QUOTES, "UTF-8"); /*** splatter the image with text ***/ imagefttext($im, 14,0,450, 390, $text_color, $font_file, $text); // Save the picture imagepng($im,$image); }else{ /*** if the file does not exist we will create our own image ***/ /*** Create a black image ***/ $im = imagecreatetruecolor(150, 30); /* Create a black image */ /*** the background color ***/ $bgc = imagecolorallocate($im, 255, 255, 255); /*** the text color ***/ $tc = imagecolorallocate($im, 0, 0, 0); /*** a little rectangle ***/ imagefilledrectangle($im, 0, 0, 150, 30, $bgc); /*** output and error message ***/ imagestring($im, 1, 5, 5, "Error loading $imagefile", $tc); }
Я не хорошо разбираюсь в хинди, но я думаю, что библиотека GD, которую вы используете, не использует правила о языке хинди, которые изменяют порядок отображения глифов. Я не знаю, что такое эти правила, но предположим, что они закодированы в таблицах GSUB или GPOS шрифта. GSUB управляет тем, как отображаются последовательности глифов, а GPOS управляет интервалом глифов. Я предполагаю, что библиотека GD не обрабатывает таблицы GPOS или GSUB, поэтому порядок вашей строки в imagettfext является порядком глифов в строке. Возможно, вам понадобится реализовать некоторый код перекоса строки в вашем скрипте, который берет строки, и правильно заказывает символы, зная, что GD Library отобразит их в том порядке, в котором они находятся в строке.
Пожалуйста, используйте следующий код для следующего правила хинди
string changeHindiGlyph(string originalText) { string[] words = originalText.Split(new char[]{' '}); for(int k = 0; k < words.Length; k++) { if(words[k].Contains("\u093f")) // check if the word contains "i" vowel { char[] arr = words[k].ToCharArray(); for (int i = 0; i < arr.Length -1 ; i++) { //interchange the order of "i" vowel if(arr[i] == '\u093f') { arr[i] = arr[i-1]; arr[i-1] = '\u093f'; } } words[k] = new string(arr); } } originalText = string.Join(" ", words); return originalText; }
Я использовал C # в приведенном выше коде, вы можете преобразовать его на свой язык сценариев. Аналогичным образом вы можете включить в код больше правил, чтобы получить желаемый текст в библиотеке GD. Надеюсь, это решает вашу проблему.