Что такое код imageftbbox


Не могу найти элемент управления ImageBox

09.05.2012, 22:41

Где найти элемент управления, похожий на Toolbox в VS
Добрый день. Помогите с поиском компоненты. Пишу в Visual Studio 2008 на C# приложение Windows.

Найти элемент управления с нулевым размером в дизайнере
Такой вопрос: ковыряю чужую прогу, на ней, на винформах мульен конролов — закладки, слои и.

Считывание картинки из одного ImageBox и установка ее в другой ImageBox
Есть два бокса для картинок. В первом боксе уже установлено изображение, а второй бокс пустует.

Не могу поместить на форму элемент управления
Раньше устанавливал VS 2010 express все запускалось без ошибок. Недавно переустановил ось(win7 64).

ImageBox

Иерархия наследования

Описание

Компонент ImageBox предназначен для загрузки и отображения изображений.

Работа с компонентом

Для загрузки изображения необходимо выполнить одно из следующих действий:

в режиме дизайна формы дважды щелкнуть по компоненту на форме.

в инспекторе объектов нажать кнопку свойства Image.

выполнить команду контекстного меню « Редактировать » для компонента.

После этого будет открыт редактор изображения компонента:

При нажатии кнопки « Загрузить » будет выведен стандартный диалог выбора файла, который в дальнейшем будет отображаться в компоненте. В список доступных изображений входят файлы в форматах: *.bmp;*.jpg;*.jpeg;*.jpe;*.jfif;*.gif;*.png;*.tif;*.tiff. Если размеры выбранной картинки больше размеров окна редактирования, то изображение будет автоматически масштабировано.

В группе « Фиксировать область » можно настроить области изображения, которые не будут масштабироваться при отображении. Для этого фоновое изображение условно разбивается на 9 частей:

При отрисовке изображения части A, C, G, I не подлежат масштабированию. Части B, H подлежат масштабированию только по горизонтали. Части D, F подлежат масштабированию только по вертикали. Часть E масштабируется полностью.

Флаг « Отображать области » управляет отображением красных линий, отделяющих фиксированные области изображения от масштабированных. Фиксированные области отображаются в том виде, в каком они содержатся в исходном файле. Вся остальная область изображения масштабируется в соответствии с размерами компонента ImageBox . Размеры фиксированной области задаются в пикселях и ограничены размерами загруженного изображения.

Флаг « Растянуть изображение » позволяет растянуть загруженное изображение на всю область окна редактирования.

Кнопка « Сохранить » позволяет сохранить изображение, загруженное в компонент.

Для настройки фонового изображения с отступами через ядро реализован специальный класс GxRectangleTransformImage. Параметры фиксированных отступов задаются в свойстве Margins.

Предупреждение: imageftbbox() [function.imageftbbox] — то, что эта ошибка

Я получил эту ошибку на моем генерации изображения сценария:

Предупреждение: imageftbbox() [function.imageftbbox]: Проблема загрузки глифов:

Я думаю, из-за этого я не могу правильно генерировать изображения из текста — как это исправить!

Создан 15 июл. 09 2009-07-15 08:29:06 Ali

Just double checked загрузил мой файл шрифта снова — теперь все ясно, спасибо за быстрый ответ man: D – Ali 15 июл. 09 2009-07-15 08:50:39

3 ответа

возникла проблема с загрузкой файла шрифта. проверьте путь, имя файла и т. д.

Создан 15 июл. 09 2009-07-15 08:39:47 dusoft

Если у вас есть проблема с файлом path/filename, вы получите предупреждение «Неверное имя шрифта».
«Проблема загрузки глифа» означает, что существует реальная проблема с форматом файла, то есть FT_Load_Glyph библиотеки gd не смог интерпретировать определение шрифта.

Создан 15 июл. 09 2009-07-15 08:58:01 VolkerK

Возможно, ваша сборка php не скомпилирована с помощью freetype2. Проверьте настройки конфигурации вашей php-сборки, запустив phpinfo() с помощью php-скрипта.

Создан 10 дек. 09 2009-12-10 00:49:30 Nick Miller

imageftbbox

(PHP 4 >= 4.0.7, PHP 5)

imageftbbox — Give the bounding box of a text using fonts via freetype2

Описание

This function calculates and returns the bounding box in pixels for a FreeType text.

Список параметров

The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).

Angle in degrees in which text will be measured.

The name of the TrueType font file (can be a URL). Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading ‘/’ by appending ‘.ttf’ to the filename and searching along a library-defined font path.

The string to be measured.

Possible array indexes for extrainfo

Key Type Meaning
linespacing float Defines drawing linespacing

Возвращаемые значения

imageftbbox() returns an array with 8 elements representing four points making the bounding box of the text:

lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle, so «upper left» means in the top left-hand corner seeing the text horizontally.

Примеры

Пример #1 imageftbbox() example

// Create a 300×150 image
$im = imagecreatetruecolor ( 300 , 150 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );
$white = imagecolorallocate ( $im , 255 , 255 , 255 );

// Set the background to be white
imagefilledrectangle ( $im , 0 , 0 , 299 , 299 , $white );

// Path to our font file
$font = ‘./arial.ttf’ ;

// First we create our bounding box
$bbox = imageftbbox ( 10 , 0 , $font , ‘The PHP Documentation Group’ );

// This is our cordinates for X and Y
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) — 5 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

imagefttext ( $im , 10 , 0 , $x , $y , $black , $font , ‘The PHP Documentation Group’ );

// Output to browser
header ( ‘Content-type: image/png’ );

imagepng ( $im );
imagedestroy ( $im );
?>

Примечания

Замечание: Эта функция нуждается в GD версии 2.0.1 или выше.

Замечание: Эта функция доступна только в случае, если PHP был скомплирован с поддержкой freetype ( —with-freetype-dir=DIR )

Что такое код imageftbbox

Подскажите, кто в теме:

который на локальном компе (установлен денвер с настройками по умолчанию) — работает, а на хостинге выдаёт ошибку:
Warning: imagettftext() [function.imagettftext]: any2eucjp(): invalid code in input string in .

при замене строчки:
$text = iconv(«WINDOWS-1251», «UTF-8», $text);
на
$text = iconv(«WINDOWS-1251», «EUC-JP», $text);
код начинает работать, но с ошибками — не всегда корректно отображает текст, а иногда тоже вылетает со схожей ошибкой.

Меню пользователя remaikee
Посмотреть профиль
Отправить личное сообщение для remaikee
Найти ещё сообщения от remaikee
09.05.2009, 02:02 #2
Меню пользователя Артем Юров
Посмотреть профиль
Найти ещё сообщения от Артем Юров

но совсем проблему это не решило.
т.е. с одними текстами отрабатывает нормально:
«Согласно Чехову, в человеке все должно быть прекрасно. Таким образом, согласно формальной логике, если в Вас что-либо не прекрасно, Вы — не человек.»
http://bzik.info/textpic/63/

а на других скрипт вылетает теперь с другой уже ошибкой, но по той же причине — ругается на японскую кодировку: Warning: imagettftext() [function.imagettftext]: any2eucjp(): input string too large in.
«Надо стараться стать человеком с детства, быть послушным, хорошо учиться, окончить институт для того, чтобы после иметь возможность удовлетворять свои животные инстинкты.»
http://bzik.info/textpic/316/

на локальном же денвере всё отрабатывает без ошибок как с использованием iconv(), так и с использованием приведённой функции. может можно что-то в настройках хостинга изменить где, чтоб велосипед не изобретать?

09.05.2009, 10:45 #3
Меню пользователя remaikee
Посмотреть профиль
Отправить личное сообщение для remaikee
Найти ещё сообщения от remaikee

проблема так и не решена. если кто в курсе как решить — подскажите, плз.

один и тот же скрипт на разный текст по разному отрабатывает.

Как в Badoo генерируются изображения для «шаринга» в соцсетях

Социальные сети — важный источник трафика. Нам выгодно, когда пользователи делятся контентом, и мы даем им такую возможность — у нас есть несколько видов контента, которым можно поделиться:

  • свой профиль;
  • чужой профиль (если его владелец это разрешил);
  • свой рейтинг, отражающий популярность пользователя на сайте;
  • награды, полученные пользователем за свои действия или действия других пользователей.

Чтобы пользователю хотелось делиться всем этим, мы генерируем специальные изображения, которые называем бейджами. Вот пример бейджа, который может получить пользователь:

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

Генерация изображений

Мы генерируем изображения для бейджей в реальном времени по запросу пользователей или ботов из социальных сетей. Мы не можем готовить их заранее, т.к. это потребовало бы очень много места для хранения и ресурсов сервера для генерации абсолютно всех изображений, которые могут потребоваться (но не факт, что действительно потребуются).
За основу схемы генерации мы взяли ту, по которой работают наши фотографии, но немного ее изменили. С точки зрения сервера генерация выглядит следующим образом:

  1. HTTP-запрос на генерацию бейджа приходит на сервер Photocache, назначение которого — принимать на себя запросы, хранить у себя кэш ответов
  2. и тем самым снижать нагрузку на сервера, хранящие сами фотографии;
  3. nginx на Photocache ищет изображение в своем кэше, и если он есть, то отдает его клиенту. Тут появляется первое отличие бейджей: т.к. запросов сравнительно немного, здесь используется стандартный кэш nginx, а не самописный модуль, как при работе с обычными фотографиями;
  4. Если в кэше ничего нет, то запрос проксируется на Bphotos — сервер, на котором хранятся фото пользователя, бейдж которого мы генерируем;
  5. nginx на Bphotos передает запрос PHP-скрипту, который загружает все необходимые ресурсы, запускает генерацию и отдает готовое изображение. В этом заключается воторое отличие: обычные пользовательские фотографии nginx отдает без помощи каких бы то ни было php-скриптов;
  6. Photocache отдает полученное изображение бейджа клиенту и кэширует его.

Каждый тип бейджа имеет свой собственный формат URL, в который мы включаем идентификаторы фотографий пользователя и других ресурсов (например, наград), которые нужны для генерации; служебные параметры, влияющие на передачу запроса к правильному серверу; коды языка и соцсети, для которой генерируется этот бейдж.

Код языка в URL очень важен, потому что Badoo — проект, локализованный под несколько языков. В обычных запросах для получения лексем мы используем объект локализации, основанный на настройках текущего пользователя. В бейджах это не работает, т.к. примерно треть запросов приходит от ботов соцсетей, которых наша система трактует как неавторизованных пользователей и пытается угадать их язык по IP-адресу. Поначалу мы об этом не подумали и получалось так, что на нашем сайте или в приложении пользователь видел картинку с текстом на одном языке, добавлял ее в свой фейсбук и видел ее же, но с текстом на английском.

Код соцсети нужен, потому что у разных соцсетей есть разные предпочтения по размерам изображений. Например, для Facebook нужны картинки 1200х630, а для Instagram — 640×640. Если мы знаем, для кого мы генерируем изображение, то мы можем подстроиться под получателя:

Кроме всего этого, обычно мы оставляем в URL место под битовую маску модификаций, которая будет использоваться, если какой-то функционал в генераторе нужно включать лишь в некоторых случаях. Например, мы использовали это поле, когда Apple просил не распространять фотографии с рейтингом пользователей iOS-приложения. Тогда мы добавили флаг для скрытия рейтинга, что позволило, с одной стороны, не ссориться с Apple, а с другой — оставить уже имеющийся бейдж там, где это возможно. Можно обойтись и без этого поля, но тогда придется создавать новый формат URL под каждую модифицированную версию бейджа, что приведет к разрастанию этих форматов и со временем усложнит поддержку.

С точки зрения кода скрипт генерации изображений выглядит следующим образом:

  1. Есть единый контроллер, который принимает запросы от сервера, определяет по формату URL необходимый тип бейджа и создает пару объектов, один из которых — непосредственно генератор, создающий изображение бейджа, а второй — источник данных для генератора.
  2. В объект-источник передаются параметры из URL, по которым он понимает, какие ресурсы нужны для создания бейджа и загружает их.
  3. В объект-генератор «сеттится» объект-источник, что позволяет генератору заниматься только только сборкой изображения из уже загруженных ресурсов.
  4. Контроллер получает результат работы объекта-генератора и возвращает его с нужными заголовками.

Структура объектов-источников данных, как правило, сильно отличается в зависимости от типа бейджа, а объекты-генераторы имеют похожую структуру, поэтому есть абстрактный класс, от которого они наследуются. Выглядит он примерно так:

Самое главное тут — метод getimage, который «дергается» из контроллера. Если он не вернет объект изображения, то контроллер вернет ошибку 404. Вызовы методов проверки доступности и сборки изображения обложены Pinba-таймерами, причем мы подставляем в названия имена конкретных классов, что дает нам данные о времени, необходимом для генерации каждого типа бейджей. Кроме этого, мы стараемся обкладывать таймерами все манипуляции с изображениями в конкретных классах-генераторах и собираем в контроллере информацию по общему времени работы источника и генератора, после чего пишем ее в базу с помощью нашей системы сбора статистики (На Хабре можно найти видео с ее описанием).

При работе с изображениями мы используем очень ограниченное число операций: поворот на произвольный угол, resize и crop изображений, наложение слоёв (в том числе с прорачностью) и добавление текста. Для их выполнения мы используем библиотеку Leptonica, обертку для которой написал Антон Довгаль (старую версию можно найти у него на github-е). Именно ее выбрали несколько лет назад за то, что она работала быстрее конкурентов. Чтобы продемонстрировать это, я сделал небольшой сравнительный тест GD, ImageMagick и Leptonica.

Для каждой из библиотек я написал скрипт, который создает новое изображение размером 1000х1000, на которое накладывается другое изображение, загруженное с диска (аналог ресурса). Чтобы приблизить код к тому, что используется при генерации бейджей, я добавил еще несколько операций над загруженным изображением — оно будет уменьшено и повернуто. Результат манипуляций будет сохранен на диск в формате JPEG. Такой сценарий позволяет оценить скорость почти всех операций, которые мы используем при генерации бейджей. Сам код в статье я приводить не буду из-за его большого размера, но для интересующихся выложу исходники на GitHub.

Я сделал 100 последовательных запусков этих скриптов на нашем сервере и получил следующие результаты:

По результатам теста получилось, что в данном сценарии Leptonica оказалась практически вдвое быстрее и GD, и Imagemagick, которые показали близкое друг к другу общее время.
Конечно, в генерации реальных бейджей используется гораздо больше манипуляций с изображениями, чем в этом тесте, поэтому нужно не надеяться на то, что Leptonica и так работает быстро, а стараться минимизировать количество требуемых операций. Для этого мы стараемся проводить оптимизации на этапе подготовки ресурсов, объединяя как можно больше слоёв в одно изображение.

Тестирование результатов генерации

Постепенно бейджей становилось все больше и нам захотелось быть уверенными, что все бейджи корректно работают после внесения изменений в код или ресурсы. Для этого мы решили использовать функциональные тесты: мы создавали заглушки пользователя, его фотографий и наград, формировали URL бейджей и передавали их генератору. Главная сложность была именно в проверке получившихся результатов. Очевидный способ — сравнивать сгенерирированное в тесте изображение с имеющимся образцом — нам очень не нравился, т.к. он либо требовал ручной сборки всех возможных образцов бейджей (чье число доходило до 50) при любом изменении и лишал нас прелести автоматизации, либо не давал гарантии, что все бейджи работают, если мы брали только часть вариантов.

После некоторых размышлений и экспериментов мы стали использовать два упрощенных типа проверок:

  1. Базовая проверка результатов генерации: мы проверяем, что генератор вернул именно изображение ожидаемого размера и оно содержит несколько цветов в контрольных точках;
  2. Сравнение нескольких результатов генерации: мы генерируем в тесте URL на два бейджа, сходных друг с другом почти во всем, но отличающихся только одним параметром (кодом языка, выводимым текстом, наградой и т.д.) и ожидаем, что мы получим два изображения, отличающиеся друг от друга. Отличие мы определяем как наличие расхождения в цветах хотя бы в одной контрольной точке.

В обеих проверках фигурирует понятие контрольных точек. Под ним я имею в виду набор точек на изображении, получаемый по какому-то правилу. Конкретно мы разбиваем изображение на 10 равных частей по горизонтали и вертикали, в результате чего на пересечении линий получаем 81 контрольную точку, для которой собираем карту цветов с помощью подобного кода:

Совпадение всех точек у двух изображений не значит, что эти изображения полностью совпадают, но это повод насторожиться и либо увеличить число таких точек, либо поменять правила их выбора в случае частых ложных срабатываний. На практике с 81 точкой мы ни разу не столкнулись с ложными срабатываниями.

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

Проблемы с выводом текстов

Хотя статья посвящена генерации изображений, проблемы, на решение которых было потрачено больше всего времени, были связаны с текстами.

Определение алфавита по тексту

Мы выводим тексты на разных языках. Некоторые языки используют алфавиты, отличные от кириллицы и латиницы, и не все шрифты их поддерживают. Поэтому важно понимать, какой алфавит нам нужен для вывода, чтобы использовать подходящий шрифт. Там, где мы выводим предопределённые лексемы, это сделать очень просто — мы знаем язык, на котором написан текст. Но кое-где мы выводим пользовательский текст (например, при «шаринге» профиля в Instagram на бейдже показавается имя пользователя) и не знаем, на каком языке он написан.

Эта проблема решилась достаточно легко, потому что найти принадлежность символа к группе можно прямо на сайте unicode.org. Все, что нам нужно было сделать — скачать таблицы и свести диапазоны групп символов в единую таблицу. Имея такую таблицу, можно проверить все символы в строке, получить список используемых групп и выбрать шрифт, поддерживающий все эти группы символов.

Главное, о чем нужно помнить: коды на сайте приводятся в UCS-4, а не в привычной многим UTF-8.

Подгонка текста под отведённые размеры

В бейджах используются тексты на разных языках, и одна и та же фраза на разных языках будет иметь разную длину (и потому требовать разного места). Для подгонки размеров текстов мы используем два алгоритма: подгонку размера шрифта и разбиение текста по строкам.

Подгонка размера шрифта. У нас есть некий «идеальный» размер шрифта и максимальная ширина, которую мы можем использовать под текст. Проверяем, помещается ли текст в эту ширину (например в GD для этого есть функции imagettfbbox и imageftbbox) и если да, то просто выводим текст. Если же текст занимает больше места, то уменьшаем размер шрифта и повторяем проверку. Код, реализующий выбор размера, выглядит следующим образом:

Данный алгоритм хорош своей простотой, но использовать его можно только для небольшого разброса в длине выводимых текстов. Большие же тексты могут потребовать значительного уменьшения размера шрифта, что сделает их нечитаемыми. Для таких случаев мы используем разбиение по строкам.

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

Разбиение по строкам плохо работает в случае, когда в одну строку не помещается лишь несколько символов. В результате такой ситуации обычно бывает одна длинная строка и одна короткая, с одним-двумя короткими словами. Чтобы исправить эту ситуацию, мы пытаемся разбить текст на две максимально близкие друг к другу по длине строки. Для этого при разбиении мы ориентируемся не на максимальную длину строки, а на половину реальной длины текста. Чтобы решить проблему длинных слов, ломающих идеальное разбиение, мы делаем два варианта: из начала текста в конец и из конца текста в начало, после чего выбираем то, у которого меньше расхождение между длинами строк.

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

Обработка текстов с написанием справа налево

Тексты, использующие написание справа налево (RTL-языки), нельзя выводить как есть — они будут совершенно нечитаемы. Связано это с тем, что у таких языков есть два порядка символов: логический, который используется при хранении, и визуальный, который мы видим.

За преобразование одного порядка в другой отвечает так называемый Unicode Bidirectional Algorithm (сокращенно — BIDI). Подробнее про это можно узнать на хабре (BIDI (unicode bidirectional algorithm)), сайте W3C (Visual vs. Logical Ordering of Text, Unicode Bidirectional Algorithm Basics) и unicode.org (Unicode Bidirectional Algorithm). Современные клиенты, работающие с Юникодом, содержат реализацию этого алгоритма, а при написании текстов на изображениях об этом приходится заботиться самостоятельно.

RTL-языков несколько, но конкретно наши пользователи используют только два — арабский и иврит, которые в сумме дают чуть меньше 1% от общего числа запросов на генерацию бейджей.

Проблема с ивритом решилась очень быстро: в PHP есть функция hebrev для преобразования логического текста в визуальный, а первый же комментарий на странице с документацией этой функции показывает, как ее использовать для текстов в UTF-8:

С арабским языком все было сложнее. Нам повезло, что наш удаленный переводчик с арабского сталкивался с такой проблемой раньше и принимал участие в создании библиотеки Ar-PHP. Библиотека содержит много функционала, но последние пару лет не очень активно развивается. Ее сайт периодически недоступен, хотя код можно найти в форках на GitHub: 1, 2, 3. В оригинальной версии преобразование текста осуществляется следующим образом:

Если обработать тексты именно так, то их можно выводить обычными функциями вроде imagettftext. Вот как это будет выглядеть:

  1. Кроме обработки есть еще пара нюансов, про которые нужно помнить при работе с RTL-текстами:
  2. При выводе текста с помощью функций графических библиотек указывается координата левой границы текста, в то время как в RTL, как правило, нужно знать правую. Поэтому перед самим выводом нужно предварительно вычислить ширину текста и уже потом, зная ее и координату правой границы текста, можно будет вычислить координату левой границы.
  3. Если вы выводите текст, разбитый на несколько строк, то нужно предварительно инвертировать их порядок. Мы разбиваем текст слева направо и получаем массив строк, в котором в первом элементе хранится текст, находящийся слева. Для RTL-текстов это будет конец, а не начало, и получится, что текст написан снизу вверх, что неправильно.

Заключение

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

Больше статей и материалов можно найти в нашем техблоге TechBadoo.

Виктор Пряжников, разработчик отдела Features

imageftbbox

(PHP 4 >= 4.0.7, PHP 5)

imageftbbox — Give the bounding box of a text using fonts via freetype2

Описание

This function calculates and returns the bounding box in pixels for a FreeType text.

Список параметров

The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).

Angle in degrees in which text will be measured.

The name of the TrueType font file (can be a URL). Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading ‘/’ by appending ‘.ttf’ to the filename and searching along a library-defined font path.

The string to be measured.

11.05.2009, 22:17 #4
Possible array indexes for extrainfo

Key Type Meaning
linespacing float Defines drawing linespacing

Возвращаемые значения

imageftbbox() returns an array with 8 elements representing four points making the bounding box of the text:

lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle, so «upper left» means in the top left-hand corner seeing the text horizontally.

Примеры

Пример #1 imageftbbox() example

// Create a 300×150 image
$im = imagecreatetruecolor ( 300 , 150 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );
$white = imagecolorallocate ( $im , 255 , 255 , 255 );

// Set the background to be white
imagefilledrectangle ( $im , 0 , 0 , 299 , 299 , $white );

// Path to our font file
$font = ‘./arial.ttf’ ;

// First we create our bounding box
$bbox = imageftbbox ( 10 , 0 , $font , ‘The PHP Documentation Group’ );

// This is our cordinates for X and Y
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) — 5 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

imagefttext ( $im , 10 , 0 , $x , $y , $black , $font , ‘The PHP Documentation Group’ );

// Output to browser
header ( ‘Content-type: image/png’ );

imagepng ( $im );
imagedestroy ( $im );
?>

Примечания

Замечание: Эта функция нуждается в GD версии 2.0.1 или выше.

Замечание: Эта функция доступна только в случае, если PHP был скомплирован с поддержкой freetype ( —with-freetype-dir=DIR )

pchart ошибка: Сообщение: imageftbbox () [function.imageftbbox]: Invalid имя файла шрифта

November 2020

1.8k раз

Я попробовал несколько различных способов, и сейчас я быть как явные, как я могу. Я использую XAMPP на Windows 7 с PHP / pChart. В моем коде у меня есть:

Я включаю «/» перед шрифтами, так что библиотека не accidentaly присоединять .ttf, который я прочитал могу произойти в некоторых случаях.

Любая помощь в этом вопросе было бы весьма признателен.

1 ответы

Я использую несколько дней назад pChart и получил ту же ошибку, когда я копировать-вставить пример кода из pChart документации. Просто попробуйте добавить расположение шрифта, добавив полный абсолютный путь к нему:

И я хранить библиотеку pChart в [root]/libs/pChart/ . Конечно , у должны быть уверены , что у вас папку «шрифты». Мой код работает отлично с ним. Так что я думаю , ваша ошибка была в попытке выделить систему шрифты вместо локальных включает.

imageftbbox

(PHP 4 >= 4.0.7, PHP 5, PHP 7)

imageftbbox — Give the bounding box of a text using fonts via freetype2

Description

This function calculates and returns the bounding box in pixels for a FreeType text.

Parameters

The font size. Depending on your version of GD, this should be specified as the pixel size (GD1) or point size (GD2).

Angle in degrees in which text will be measured.

The name of the TrueType font file (can be a URL). Depending on which version of the GD library that PHP is using, it may attempt to search for files that do not begin with a leading ‘/’ by appending ‘.ttf’ to the filename and searching along a library-defined font path.

The string to be measured.

Possible array indexes for extrainfo

Key Type Meaning
linespacing float Defines drawing linespacing

Return Values

imageftbbox() returns an array with 8 elements representing four points making the bounding box of the text:

lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle , so «upper left» means in the top left-hand corner seeing the text horizontally.

Examples

Example #1 imageftbbox() example

// Create a 300×150 image
$im = imagecreatetruecolor ( 300 , 150 );
$black = imagecolorallocate ( $im , 0 , 0 , 0 );
$white = imagecolorallocate ( $im , 255 , 255 , 255 );

// Set the background to be white
imagefilledrectangle ( $im , 0 , 0 , 299 , 299 , $white );

// Path to our font file
$font = ‘./arial.ttf’ ;

// First we create our bounding box
$bbox = imageftbbox ( 10 , 0 , $font , ‘The PHP Documentation Group’ );

// This is our cordinates for X and Y
$x = $bbox [ 0 ] + ( imagesx ( $im ) / 2 ) — ( $bbox [ 4 ] / 2 ) — 5 ;
$y = $bbox [ 1 ] + ( imagesy ( $im ) / 2 ) — ( $bbox [ 5 ] / 2 ) — 5 ;

imagefttext ( $im , 10 , 0 , $x , $y , $black , $font , ‘The PHP Documentation Group’ );

// Output to browser
header ( ‘Content-Type: image/png’ );

imagepng ( $im );
imagedestroy ( $im );
?>

Notes

Note: This function requires GD 2.0.1 or later (2.0.28 or later is recommended).

Note: This function is only available if PHP is compiled with freetype support ( —with-freetype-dir=DIR )

User Contributed Notes

imagettfbbox() returns an array with 8 elements representing four points making the bounding box of the text:

0 lower left corner, X position
1 lower left corner, Y position
2 lower right corner, X position
3 lower right corner, Y position
4 upper right corner, X position
5 upper right corner, Y position
6 upper left corner, X position
7 upper left corner, Y position

The points are relative to the text regardless of the angle, so «upper left» means in the top left-hand corner seeing the text horizontally.

ImageFTBBox returns a bounding box, not metrics, as some (most?) of the notes above seem to assume. The 8 values it returns specify the 4 corners of this bounding box. So to properly determine the width and height of a string you need to do:

$bbox = ImageFTBBox(. );
$w >$height = abs($bbox[1]) + abs($bbox[5]); // distance from top to bottom

Here is a handy example I used to center «dynamic text» onto an image.

Ex. Say you want to center a clients IP Address onto a picture.

$details = imageftbbox($fontsize, 0, $font, $ip, array(«linespacing» => 1));

$xcoord = ($imgwidth — $details[4]) / 2; // this will return the x coordinate centered to your specific image. Make sure you set $imgwidth to the width of the image you are using.

imagettftext($image, $fontsize, 0, $xcoord, $ycoord, $fontcolor, $font, $ip);

i’ve found a work around for this situation

it seems that height is directly proportional to line spacing so you just have to apply the same factor to image height

$spacing = 0.7;
$params = array(«linespacing» => $spacing);

$box = imageftbbox ($size, 0, $font, $text, $params);
$tw=$box[4]-$box[0]; //image width
$th=($box[1]-$box[5])*$spacing; //image height

This function can be used to generate right-aligned text. Just work out how wide the text image is and position it accordingly. Example:

$i_w >$i_height = 40;

$string = «Hello World!»;
$pointsize = 10;
$fontfile = «/usr/local/lib/ttf/Helve.ttf»;

$im = imagecreate($i_width, $i_height);
$black = imagecolorallocate ($im, 0, 0, 0);
$white = imagecolorallocate ($im, 255, 255, 255);

$string_size = ImageFtBbox($pointsize, 0, $fontfile, $string, array(«linespacing» => 1));
$s_w >$s_height = $string_size[5];

ImageFtText($im, $pointsize, 0, $i_width — $s_width — 1, 0 — $s_height, $white, $fontfile, $string, array(«linespacing» => 1));

Header («Content-type: image/png»);
ImagePNG ($im);
ImageDestroy ($im);

I noticed that PHP’s True Type functions do not allow you to create text blocks with multiple lines that automatically adjust for alignment. I wrote a function that will allow you to generate images with multiple lines, control the alignment, and handle rotation. I hope it helps someone.

There was too much code to paste on this message post so you can grab it off of my webserver. I also created an example page so that you can see the code in action.

Download the Text file:
http://www.PrintsMadeEasy.com /code_samples/php/text_generation.txt

For alignment i used this method:

if($align == «center» || $align == «right»)
<
$verticaltxtspace = $backwidth — (2 * $posx);
$spacepositions = imagettfbbox($size, $angle, «fonts/verdanaz.ttf», » «);
$spacepx = $spacepositions[4] — $spacepositions[0];

// Split text in lines
$lines = split(«[\r][\n]», $text);
for($count = 0; $count

Наложение текста на изображение по центру на php

Наложение текста на картинку при помощи php не такая уж и сложная задача, главное разобраться с функцией imagettftext(), которая имеет ряд параметров:

Описание

imagettftext(‘Фон или фотка’, ‘Размер шрифта’, ‘Угол наклона’, ‘Координат оп оси X’, ‘Координат оп оси Y’, ‘Цвет шрифта’, ‘Путь к файлу со шрифтом’, ‘Любой текст’)

  • Фон или фотка = imagecreatefromjpeg(«images/img.jpg») — (в нашем случае это изображение)
  • Размер шрифта = 22 — 22px
  • Угол наклона = 30 — 30 градусов наклон надписи
  • Координат оп оси Y = 200 — 200 пикселей отступ сверху
  • Координат оп оси X = 100 — 100 пикселей отступ слева
  • Цвет шрифта = imageColorAllocate(‘Фон или фотка’, 255, 255, 255) — возвращает идентификатор цвета, представляющий цвет, составленный из данных RGB-компонентов.
  • Путь к файлу со шрифтом = «fonts_capcha/tahoma.ttf» — тут все понятно
  • Любой текст = ‘Тект который мы будем накладывать на фотку’

Код php наложения текста

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

Обводка на текст при помощи php создается очень просто — нужно всего лишь создать такие же текста функцией imagettftext(), но на 1,2 пикселя смещая координаты.

Наложение текста по центру

imagettfbbox() возвращает массив из 8 элементов, представляющих 4 точки, образующие бокс текста:

0- нижний левый угол, X-позиция
1- нижний левый угол, Y-позиция
2- нижний правый угол, X-позиция
3- нижний правый угол, Y-позиция
4- верхний правый угол, X-позиция
5- верхний правый угол, Y-позиция
6- верхний левый угол, X-позиция
7- верхний левый угол, Y-позиция

Разметка на html

Разметку мы делаем для наглядного примера и удобного теста.

Илон Маск рекомендует:  Нейрокомпьютерная техника почему именно искусственные нейронные сети
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL