Blog. Just Blog

Картинка в виде текста на блокноте

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Картинка в виде текста на блокноте
Картинка в виде текста на блокноте

Нарисовал тут PHP-скрипт для создания стильных изображений с текстом в блокноте, который автоматически превращает обычный текст в изображения, стилизованные под рукописные записи в блокноте. Один-два изображения еще можно сделать руками в какой-нибудь фотожопе. Но вдруг потребуются картинки сразу и много, скрипт решает эту проблему.

Раздельные изображения можно делать самому, или скопировать кусками его из целой картинки. Автоматически настраивается верхняя часть, центральная часть (одна строка), нижняя часть. Центральная часть повторяется столько раз, сколько нужно строк текста. Шрифты лучше смотрится как будто написаны рукой.

Шрифт и файл "блокнота"Шрифт и файл "блокнота"

Notebook.PHP.zip (56,897 bytes)
  1. <?
  2. /**
  3.  Основные настройки
  4.  */
  5.  
  6. // Файл фонового изображения блокнота
  7. $notebook_file 'notebook.jpg';
  8.  
  9. // Текст для вставки
  10. $text='Технический текст - это информационно насыщенное,'.
  11.       ' структурированное и точное изложение знаний,'.
  12.       ' предназначенное для передачи сведений о принципах'.
  13.       ' работы, составе, функциях или правилах использования'.
  14.       ' объектов технической, инженерной или научной'.
  15.       ' направленности.';
  16.  
  17. // Блокнот
  18. $nb_top 54;     // Верхнее поле
  19. $nb_bottom 56;  // Нижнее поле
  20. $nb_center 62;  // Расстояние между строками
  21.  
  22. // Путь к файлу шрифта
  23. $nb_font __DIR__.'/notebook.otf';
  24. // Настройки шрифта
  25. $nb_size 40;         // Размер шрифта
  26.  
  27. $nb_text_left 150;   // Отступ слева
  28. $nb_text_top 62;     // Отступ сверху для первой строки
  29. $nb_text_right 60;   // Отступ справа
  30. $nb_text_size 25;    // Отступ текста
  31.  
  32. $notebook imagecreatefromjpeg($notebook_file);
  33. $notebook_width imagesx($notebook);
  34. $notebook_height imagesy($notebook);
  35.  
  36. $tmp_box imagettfbbox($nb_size0$nb_font'test');
  37. $nb_text=abs($tmp_box[5]);
  38.  
  39. /**
  40.  Функция для переноса строк с поддержкой UTF-8
  41.  */
  42. function utf8_wordwrap($string$width=25$break="\n"$cut=false) {
  43.     if($cut) {
  44.         $search '/(.{1,'.$width.'})(?:\s|$)|(.{'.$width.'})/uS';
  45.         $replace '$1$2'.$break;
  46.     }
  47.     else {
  48.         $search '/(?=\s)(.{1,'.$width.'})(?:\s|$)/uS';
  49.         $replace '$1'.$break;
  50.     }
  51.     $tdd=preg_replace($search$replace$string);
  52.     // echo $tdd.' ';
  53.     return $tdd;
  54. }
  55.  
  56. // Подбираем оптимальную длину строки
  57. $wrap mb_strlen($text'UTF-8');
  58.  
  59. while(true) {
  60.     $tmp_wrap utf8_wordwrap($text$wrap"\n"true);
  61.     $tmp_box imagettfbbox($nb_size0$nb_font$tmp_wrap);
  62.  
  63.     // Проверяем, помещается ли текст по ширине
  64.     if (($tmp_box[2] - $tmp_box[0]) <
  65.         ($notebook_width $nb_text_left $nb_text_right)) {
  66.         break;
  67.     }
  68.  
  69.     $wrap--;
  70.  
  71.     if ($wrap == 0) {
  72.         $tmp_wrap utf8_wordwrap($text,
  73.             mb_strlen($text'UTF-8'), "\n"true);
  74.         $tmp_box imagettfbbox($nb_size0,
  75.             $nb_font$tmp_wrap);
  76.         break;
  77.     }
  78. }
  79.  
  80. // Рассчитываем необходимую высоту изображения
  81. // Количество строк
  82. $line_count count(explode("\n"$tmp_wrap));
  83.  
  84. $line_width=($line_count-1)*(abs($nb_text)+$nb_text_size);
  85. $line_width=ceil($line_width/$nb_center)*$nb_center;
  86.  
  87. $height=$nb_top+$nb_bottom+ceil($line_width/$nb_center)*$nb_center;
  88. $width=$notebook_width;
  89.  
  90. $im=imagecreatetruecolor($width$height);
  91.  
  92. // Собираем изображение блокнота
  93. ImageCopy($im$notebook0$pos00$width$nb_top);
  94. $pos+=$nb_top;
  95.  
  96. for ($i=0$i<($line_width/$nb_center); $i++) {
  97.     ImageCopy($im$notebook0$pos0$nb_bottom,
  98.         $width$nb_center);
  99.     $pos+=$nb_center;
  100. }
  101.  
  102. ImageCopy($im$notebook0$pos0,
  103.     ($notebook_height-$nb_bottom), $width$nb_bottom);
  104. $pos+=$nb_bottom;
  105.  
  106. // Черный цвет для текста
  107. $black ImageColorAllocate($im000);
  108.  
  109. $top=$nb_text_top+$nb_text;
  110.  
  111. $tmp=explode("\n"$tmp_wrap);
  112. for ($i=0$i<$line_count$i++) {
  113.     // Добавляем текст
  114.     Imagettftext($im$nb_size0$nb_text_left$top,
  115.         $black$nb_font$tmp[$i]);
  116.     $top+=($nb_text+$nb_text_size);
  117. }
  118.  
  119. // Выводим изображение
  120. header('Content-type: image/jpeg');
  121. // 100% качество
  122. imagejpeg($imNULL100);
  123.  
  124. // Освобождаем память
  125. imagedestroy($im);
Высота изображения рассчитывается динамически. Размер шрифта автоматически подстраивается под ширину, количество строк определяется длиной текста.

Пример картинки
Пример картинки

Пример картинки
Пример картинки

Пример картинки
Пример картинки

Такой подход позволяет создавать блокноты любой высоты с сохранением пропорций и качества изображения. Запустите скрипт, он создаст изображение с нужным текстом. Вот примеры разных шрифтов и размеров.

Поделиться ссылкой ВКонтакте
Просмотров: 577 | Комментариев: 3

Метки: PHP, графика

Комментарии

Отзывы посетителей сайта о статье
BarMentaLisk (10.09.2025 в 03:08):
Лаконично, юзабельно, спасибо!
SVS (29.08.2025 в 17:48):
Димыч, как всегда, на высоте! )) Благодарю за интересное решение!
NFishka (26.08.2025 в 18:32):
Это просто магия какая то !
Спасибо

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0039 сек.) / Память: 4.5 Mb
Наверх