За последние 24 часа нас посетили 17296 программистов и 1192 робота. Сейчас ищут 1364 программиста ...

Не совпадение координат для вывода текста (GD)

Тема в разделе "PHP для новичков", создана пользователем Bastonc, 10 дек 2018.

  1. Bastonc

    Bastonc Новичок

    С нами с:
    27 ноя 2018
    Сообщения:
    12
    Симпатии:
    1
    Всем привет. Итак стоит следующая задача.
    На сайте есть картинка на которую в определенном месте наносится текст и все это выгружается пользователю в виде картинки. Для лучшего понимания картинка - это шаблон диплома (ну типа грамота красивая), а надпись это имя и фамилия
    Картинки могут быть разные, в том числе разных размеров и разной ориентации (альбомная или книжная)
    Как реализовывается для эксплуатации.
    Контент менеджер загружает на сайт картинку и указывает в каком месте будет устанавливаться надпись (для разных картинок это могут быть разные места).
    Пользователь если он выпонил условия диплома получает картинку с его именем и фамилией.
    Как это реализуется программно.
    Грузим картинку в полном размере на сервер, выдаем эту картинку на страницу на которой происходит указывание координат вывода текста.
    Делается это посредством такого не хитрого скрипта

    Код (Javascript):
    1. <!doctype html>
    2. <html lang="en">
    3. <head>
    4.  
    5. <style type="text/css">
    6.  
    7. #el{
    8.   position:relative;
    9.   width: 100%;
    10. /* z-index: 2*/
    11.   /*background:#555*/
    12. }
    13.  
    14.  
    15. .stamp{
    16.     width:200px;
    17.     height:40px;
    18.     background:#ddd;
    19.     position: absolute;
    20.     opacity:0.9;
    21.     /*z-index: 2*/
    22.    
    23. }
    24. .stamp2{
    25.     width:200px;
    26.     height:40px;
    27.     background:#ddd;
    28.     position: absolute;
    29.     opacity:0.6;
    30.     /*z-index: 2*/
    31.    
    32. }
    33. .description{
    34.     width:100%;
    35.     height: 100px;
    36.     border:2px;
    37. }
    38. </style>
    39.  
    40. </head>
    41. <body>
    42. <div class="description"><form method="POST" action="">
    43. <form action="" method="POST">
    44. Выберите цвет надписи и укажите место на дипломе где будет располагаться позывной и имя соискателя
    45. <select name="color"><option>Черный</option><option>Белый</option></select>
    46. <input type='hidden' id="X">
    47. <input type='hidden' id="Y">
    48. <button type="submit"> Указал </button>
    49. </form>
    50. </div>
    51. <img id="el" src='1.png'>
    52. <script type="text/javascript">  
    53. var el = document.getElementById('el');
    54.     el.addEventListener('click', getClickXY, false);
    55.     el.addEventListener('mousemove', moveClickXY, false);
    56. //mouseup
    57.  
    58. function getClickXY(event)
    59.   {
    60.     var clickX = (event.layerX == undefined ? event.offsetX : event.layerX) + 1;
    61.     var clickY = (event.layerY == undefined ? event.offsetY : event.layerY) + 1;
    62.     document.getElementById('stmove').style.zindex=-1;
    63.      document.getElementById('X').value = clickX+12;
    64.      document.getElementById('Y').value = clickY;
    65.     divkoordinateY=clickY+108;
    66.     document.getElementById('st').style.top = divkoordinateY+'px';
    67.      document.getElementById('st').style.left = clickX+12+'px';
    68.     alert('Координаты обозначены. Выберите цвет и нажмите "Указал""' );
    69.  
    70.   }
    71. function moveClickXY(event)
    72. {
    73.     //document.getElementById('st').style.top = divkoordinateY+'px';
    74.     var clickX = (event.layerX == undefined ? event.offsetX : event.layerX) + 1;
    75.     var clickY = (event.layerY == undefined ? event.offsetY : event.layerY) + 1;
    76.      divkoordinateY=clickY+108;
    77.     document.getElementById('st').style.zindex =-1;
    78.     document.getElementById('stmove').style.top = divkoordinateY+'px';
    79.      document.getElementById('stmove').style.left = clickX+12+'px';
    80. }
    81.  
    82. </script>
    83.  
    84. <div class="stamp" id="st"><center>AA1BB<br />Name Sirname</center></div>
    85. <div class="stamp2" id="stmove"><center>AA1BB<br />Name Sirname</center></div>
    86.  
    87. </body>
    88. </html>
    Тут дам небольшое пояснение - в верхней части страницы выводится блок с фиксированной высотой в 100 пикселей, эти +100 пискелей(точнее 108 - 8 пискелей, что бы оторвать указатель мышки от слоя, что б удобнее таскался слой) прибавляются к координатам слоя который используется для визуализации. Сам клик по изображению дает точные координаты относительно верхнего левого угла изображения(позиционирование клика относительно изображения, а позиционирование слоя для визуализации - абсолютное) - эти точные координаты передаются в поля формы, которая и отправляется на сервер.
    Таким образом получаем координаты начала вывода строки - эти координаты поступают в скрипт и записываются в базу.
    Далее
    При запросе пользователем, если он получает диплом, на загруженную картинку в сохраненных координатах начинает выводится текст с помощью библиотеки GD, с помощью imagettftext.
    Но проблема в том, что эти координаты по факту не совпадают - получаются значительно ниже того места где они указывались. Никто не сталкивался с подобным? Или где ошибка.
    Буду очень благодарен за ответ.
     
  2. Bastonc

    Bastonc Новичок

    С нами с:
    27 ноя 2018
    Сообщения:
    12
    Симпатии:
    1
    Разобрался с вопросом - причина оказалась в том, что по тегу <img width=100%> - размер привязывается к окну, а не 100% от размера картинки. Поэтому пошел простым путеем - в крипте сначала определяю истинный размер изображения с помощью функции GD imagesize, если не ошибаюсь, и во вьюху выталкиваю не только путь, но и размеры картинки. добавляя эти аттрибуты к тегу img - таким образом не зависисмо от браузера и разрешения - получаем истинные размеры и далее вышеуказанными скриптами определяем координаты и передаем их в базу. Все работает. Теперь осталось дописать, что бы пользователь на этапе установки координат еще и выбирал размер шрифта. Ибо если диплом большой - мелкий шрифт смотрится ущербно и наоборот, если маленький диплом то крупный шрифт - выглядит нелепо.