За последние 24 часа нас посетили 19488 программистов и 1964 робота. Сейчас ищут 1406 программистов ...

Координаты изображения

Тема в разделе "Обработка изображений средствами PHP", создана пользователем meganosets, 11 дек 2006.

  1. meganosets

    meganosets Активный пользователь

    С нами с:
    13 июл 2006
    Сообщения:
    47
    Симпатии:
    0
    Возникает проблема при выводе текста на изображении, когда текст написан на "иврите".
    На иврите пишут с права налево, а координаты текста в ImageTTFText(); определяются по левому углу, и при написании нескольких слов одно под другим, слова выравниваются по левому углу, а нужно по правому.
    Пожалуйста подскажите что можно сделать?

    код:

    Код (Text):
    1. $image = "backround.jpg";
    2. $coin = imagecreatefromjpeg($image);
    3. $font="david.ttf";
    4. $black = ImageColorAllocate ($coin, 0, 0, 0) ;
    5.  
    6. $text="םולש
    7. רשוכו רשוא הברה חמש
    8. גח הבוט נהש יביב";
    9.  
    10. ImageTTFText ($coin, 70, 0, 50, 200, $black, $font ,$text);
    11. imagejpeg($coin,"new.jpg");
    12. ImageDestroy ($coin);
     
  2. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Рисовать каждую буковку отдельно, самостоятельно вычисляя координаты.
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    meganosets

    делаешь флип слева на право изображения. пишешь текст. флип обратно.
     
  4. meganosets

    meganosets Активный пользователь

    С нами с:
    13 июл 2006
    Сообщения:
    47
    Симпатии:
    0
    А что значит флип?
    приведите пример кода пожалуйста.
     
  5. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    http://440hz.ru/trash/flip/

    PHP:
    1. <?
    2.  
    3. // 2006 (c) 440hz
    4.  
    5. // отражение картинки по вертикали
    6.  
    7. function imageflipvertical(&$img) {
    8.  
    9.     $size_x = imagesx($img);
    10.     $size_y = imagesy($img);
    11.     $temp = imagecreatetruecolor($size_x, $size_y);
    12.     $rc = imagecopyresampled($temp, $img, 0, 0, 0, ($size_y-1), $size_x, $size_y, $size_x, 0-$size_y);
    13.     if ($rc) {
    14.         $img = $temp;
    15.     }
    16.     else {
    17.         die("Unable to vertical flip image");
    18.     }
    19. }
    20.  
    21. // отражение картинки по горизонтали
    22.  
    23. function imagefliphorizontal(&$img) {
    24.  
    25.     $size_x = imagesx($img);
    26.     $size_y = imagesy($img);
    27.     $temp = imagecreatetruecolor($size_x, $size_y);
    28.     $rc = imagecopyresampled($temp, $img, 0, 0, ($size_x-1), 0, $size_x, $size_y, 0-$size_x, $size_y);
    29.     if ($rc) {
    30.         $img = $temp;
    31.     }
    32.     else {
    33.         die("Unable to horizontal flip image");
    34.     }
    35. }
    36.  
    37. // дубликат
    38.  
    39. function imageduplicate($img) {
    40.     $size_x = imagesx($img);
    41.     $size_y = imagesy($img);
    42.     $temp = imagecreatetruecolor($size_x, $size_y);
    43.     $rc = imagecopyresampled($temp, $img, 0, 0, 0, 0, $size_x, $size_y, $size_x, $size_y);
    44.     if ($rc) {
    45.         return $temp;
    46.     }
    47.     else {
    48.         die("Unable to duplicate image");
    49.     }
    50. }
    51.  
    52. // изменить размеры
    53.  
    54. function imageresize(&$img,$w,$h) {
    55.     $size_x = imagesx($img);
    56.     $size_y = imagesy($img);
    57.     $temp = imagecreatetruecolor($w, $h);
    58.     $rc = imagecopyresampled($temp, $img, 0, 0, 0, 0, $w, $h, $size_x, $size_y);
    59.     if ($rc) {
    60.         $img = $temp;
    61.     }
    62.     else {
    63.         die("Unable to resize image");
    64.     }
    65. }
    66.  
    67. // собстенно сами хлопоты
    68.  
    69.  
    70. // получаем источик
    71. $me = 'me.jpg';
    72. $src = imagecreatefromjpeg($me);
    73. $mw = imagesx($src);
    74. $mh = imagesy($src);
    75.  
    76. // дублируем
    77. $dst = imageduplicate($src);
    78.  
    79. // делаем в 2 раза меньше
    80. $w = imagesx($dst)/2;
    81. $h = imagesy($dst)/2;
    82. imageresize($dst,$w,$h);
    83.  
    84. // отражаем
    85. imagefliphorizontal($dst);
    86.  
    87. // рисуем
    88. $x = 0;
    89. $y = ($mh-$h);
    90. imagecopyresampled($src, $dst, $x, $y, 0, 0, $w, $h, $w, $h);
    91.  
    92. // выводим
    93. imagejpeg($src);
    94.  
    95. ?
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ступил. в данном случае нужно делать как сказал vasa_c. руками все высчитывать. Флип тут не поможет.


    а зашли мне фонт на мыло и пример текста. поковыряюсь на досуге. пригодится.
     
  7. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    vasa_c подумал и решил, что то что он сказал тоже фигня )
    ИМХО лучше сначала перевернуть строку, а потом уже ее просто вывести.
     
  8. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    не получится. нужно же выводить справа налево, а не просто перевернуть
    =)
     
  9. vasa_c

    vasa_c Активный пользователь

    С нами с:
    22 мар 2006
    Сообщения:
    1.760
    Симпатии:
    0
    Адрес:
    гор.Ленинград
    Я имею ввиду строку сначала перевернуть.
    "Была строка", а стала — "акортс алыБ" а потом вывести ее.
    Хотя я иврита не знаю и как шрифты там устроены тоже, так что может это не сработает.
     
  10. Mavir

    Mavir Guest

    Только вычислять не координаты каждой буковки, а координаты начала строки. Для вычисления длины строки можно использовать функцию http://php.net/imagettfbbox
     
  11. Mavir

    Mavir Guest

    Выводится как раз слева направо, а вот читается наоборот :)
     
  12. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    тогда я не понял чем трудность? вычисляешь длину строки и выводишь с нужным смещением относительно правого края.
     
  13. meganosets

    meganosets Активный пользователь

    С нами с:
    13 июл 2006
    Сообщения:
    47
    Симпатии:
    0
    спасибо за подсказки!
    наконецто смастерил
    вот моё творение :D

    Код (Text):
    1.  
    2. function text_convert($image,$text,$color,$font,$font_size,$margin,$x,$y)
    3. {
    4. $text=@preg_replace("/([\xE0-\xFA])/e","chr(215).chr(ord(\${1})-80)",hebrevc($text));
    5. $s=explode("<br />",$text);
    6.  
    7.     for ($i=0;$i<count($s);$i++)
    8.     {
    9.     if($i>1) $y=$y+$margin;
    10.     $size = imagettfbbox($font_size, 0, $font, $s[$i]);
    11.     $dx = abs($size[2]-$size[0]);
    12.     ImageTTFText($image, $font_size, 0, $x-$dx, $y, $color, $font, $s[$i]);
    13.     }
    14. }
    15.  
    16. $image = imagecreatefromjpeg("backround.jpg");
    17. $text = "שלום לכולם
    18. אחלה
    19. בסדר גמור, וסימחה
    20. טורה
    21. שנה טובה";
    22.  
    23. $color= ImageColorAllocate ($image, 0, 0, 0) ;
    24. $font = "david.ttf";
    25. $font_size = 15;
    26. $margin = 20;
    27. $x = 400;
    28. $y = 15;
    29.  
    30. text_convert($image,$text,$color,$font,$font_size,$margin,$x,$y);
    31.  
    32. imagejpeg($image);
    33. ImageDestroy ($image);