כתיבת עיברית תקינה על תמונה - GD
על מנת לכתוב עיברית על תמונה, ובכלל ליצור תמונה, יש לאפשר בשרת שלכם את הפעילות של ספריית ה-GD וספרית ה-Font. פרטים על הפעלתם תוכלו למצוא ב: http://www.php.net/manual/en/ref.image.php.
אחרי שהפעלתם את האפשרות לשימוש בפונקצית תמונה, יש צורך ליצור קובץ חדש שמקודד בקידוד UTF-8. חשוב שלקובץ הזה לא תהיה חתימת BOM שנוצרת בתחילתו, ואת החתימה אפשר להסיר עם תוכנות מסוימות כמו notepad++, שניתן להוריד אותה מהאתר הבא: http://notepad-plus.sourceforge.net/uk/site.htm . (אם הלינק שבור, חפשו בגוגל)
חשוב שכל הקובץ, כולל הקוד שבתוכו יקודד באותו הקידוד שהוא UTF-8 כדי שהעיברית תפעל כמו שצריך. וכיוון שמשתמשים פה בקידוד multiByte (קידוד UTF-8 מתרגם כל 2 בתים לתו גרפי\ויזואלי יחיד), יש צורך להשתמש בפונקציות mbString שאפשר למצוא בעמוד הבא: http://www.php.net/manual/en/ref.mbstring.php .
קודם אפרסם את הקוד שמפעיל את העיברית התקינה על התמונה ואח"כ אסביר בקצרה על החלקים בו:
קוד PHP:
<?php
# Author: DCD.
/* GD Image - Hebrew Proper Result */
$encoding = 'UTF-8';
header('Content-type: image/png;');
mb_detect_order($encoding.', ASCII, ISO-8859-8-I');
mb_regex_encoding($encoding);
mb_internal_encoding($encoding);
/* Vars setup: */
$tSize = 16; # Font size: 16
$font = 'c:\windows\fonts\TIMES.TTF'; # Font type: times new roman
$text = 'טקסט בדיקה. שילוב English לבדיקה מקיפה, וגם סימנים אחרים!'; # The output-to-image string
/* Text Correction: */
$wordsCache = array();
$properStr = '';
$text = mb_ereg_replace('([\S]+[\s]*)', "Reverse('\\1')", $text, 'e');
$text = lastReverse();
$boxSize = imagettfbbox($tSize, 0, $font, $text);
$width = $boxSize[2]+3;
$height = $boxSize[1] - $boxSize[7] + $boxSize[3];
$im = imagecreatetruecolor($width,$height);
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0, 0, $width, $height, $white);
imagettftext($im, $tSize, 0, 0, 20, $black, $font, $text);
imagepng($im);
imagedestroy($im);
function charsReverse($text)
{
global $encoding;
$cacheChars = '';
for($i=mb_strlen($text); $i > 0; --$i)
$cacheChars .= mb_substr($text, $i-1, 1, $encoding);
return $cacheChars;
}
function Reverse($inStr)
{
global $wordsCache;
if (mb_ereg_match('([\x{05D0}-\x{05EA}]+)', $inStr) || mb_ereg_match('([\W\d_]+)', $inStr))
$wordsCache[]= charsReverse($inStr);
else
$wordsCache[]= mb_ereg_replace('(([\S]+)([\s]*))', '\\3\\2', $inStr);
}
function lastReverse()
{
global $properStr, $wordsCache;
for ($i = count($wordsCache); $i >= 0 ; --$i )
$properStr .= $wordsCache[$i];
return $properStr;
}
?>
הקוד הנ"ל אמור להיות בתוך הקובץ שמקודד בקידוד UTF-8 ושללא חתימת BOM.
נעבור להסבר על החלקים...:
הקוד:
קוד PHP:
$encoding = 'UTF-8';
header('Content-type: image/png;');
mb_detect_order($encoding.', ASCII, ISO-8859-8-I');
mb_regex_encoding($encoding);
mb_internal_encoding($encoding);
הסבר:
הגדרת הקידוד (UTF-8) שאנחנו הולכים להשתמש בו בפונקציות ה-mbString, וקביעת כותר של תמונה בפורמט png.
הקוד:
קוד PHP:
/* Vars setup: */
$tSize = 16; # Font size: 16
$font = 'c:\windows\fonts\TIMES.TTF'; # Font type: times new roman
$text = 'טקסט בדיקה. שילוב English לבדיקה מקיפה, וגם סימנים אחרים!'; # The output-to-image string
הסבר:
הגדרות ראשוניות הניתנות לשינוי. יש את גודל הטקסט, סוג הפונט של הטקסט והטקסט עצמו...
הקוד:
קוד PHP:
$wordsCache = array();
$properStr = '';
$text = mb_ereg_replace('([\S]+[\s]*)', "Reverse('\\1')", $text, 'e');
$text = lastReverse();
הסבר:
בגלל שבדר"כ הטקסט המוצג בתמונות הוא מהופך (לדוגמא במקום שייכתב "שלום" ניכתב בתמונה "םולש") יש צורך להפוך אותו. בלוק הקוד הנ"ל והפונקציות שנמצאות בחלק התחתון ביותר בקוד הכללי הופכות את העיברית כדי שהיא תוצג כמו שצריך בתמונה.
הקוד:
קוד PHP:
$boxSize = imagettfbbox($tSize, 0, $font, $text);
$width = $boxSize[2]+3;
$height = $boxSize[1] - $boxSize[7] + $boxSize[3];
$im = imagecreatetruecolor($width,$height);
הסבר:
קביעת גודל התמונה בהתאם לאורך המחרוזת בעזרת הפונקציה imagettfbbox. אני עדיין לא מבין לגמרי את הערכים שמחזירה הפונקציה הזאת, אבל הצלחתי לקמבן משהו למקרה הספציפי הזה המוצג פה.
הקוד:
קוד PHP:
$black = imagecolorallocate($im, 0, 0, 0);
$white = imagecolorallocate($im, 255, 255, 255);
imagefilledrectangle($im, 0, 0, $width, $height, $white);
imagettftext($im, $tSize, 0, 0, 20, $black, $font, $text);
imagepng($im);
imagedestroy($im);
הסבר:
החלק שבדר"כ ידוע לכולם, שבו יוצרים את התמונה וכותבים עליה את הטקסט הרצוי.
---------------------------------------------------------
מקווה שתגובה זו עזרה למישהו שעוסק בעניין הזה, כי בסה"כ ראיתי מספר פעמים אשכולות שנפתחו בנושא והאנשים לא מצאו פיתרון לבעיה. וכיוון שזו בעיה שלא נפתרה ודי פופולרית, הצעתי פיתרון פה...
הערה: עשיתי את כל הפונקציות האלה כדי שיהיה אפשרות לשלב אנגלית ועיברית ביחד, באותה המחרוזת ובאותה התמונה. אחרת אני חושב שהיה אפשר ביותר קלות לבצע את הפיתרון הזה.
בהצלחה.
נערך לאחרונה ע"י DCD בתאריך 23-07-2007 בשעה 04:26.
|