Создание изображений средствами PHP


Оглавление (нажмите, чтобы открыть):

Создание изображений средствами PHP

Вывод изображения клиенту

Итак, мы нарисовали наш график. Теперь остается отправить это изображение в браузер.

* Посылаем заголовок, показывающий что мы выводим изображение в формате GIF или PNG.
* Определяем чересстрочный формат вывода изображения.
* Делаем цвет фона прозрачным.
* Используя функцию imageGIF или imagePNG выводим изображение.

php
//header(Content-type: image/gif);
header ( Content-type: image/png );

// задаем чересстрочный режим
imageInterlace ( $image , 1 );
// делаем цвет фона прозрачным
imageColorTransparent ( $image , $colorBackgr );
//imageGIF($image);
imagePNG ( $image );
?>

Совет После вызова imageGIF или imagePNG, изменения в изображение вносить уже нельзя, так как оно уже было отправлено клиенту.

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

Функция ImageColorTransparent() задает цвет прозрачных участков изображения (опять же, если используемый формат позволяет это). В нашем примере мы используем цвет, сохраненный в переменной $colorBackgr, делая участки изображения, нарисованные этим цветом, прозрачными.
Как использовать полученное изображение

Итак, мы написали программу, создающую изображение. Как ее использовать? На самом деле все очень просто: Вы можете использовать скрипт в HTML коде как обычный файл изображения. Поскольку скрипт в нашем примере является интерактивным, то для его использования нам нужно ввести https://my.server.net/script.php в адресную строку браузера. Для скрипта, не требующего пользовательского ввода, например получающего информацию из базы данных, просто вставьте в HTML код страницы тэг такого содержания:

Полный код скрипта

php
//
// шапка страницы
//
function pageHeader ()
<

print( );
print( Biorhythm with PHP3 );
print( );

//
// подвал страницы
//
function pageFooter ()
<

Обработка изображений средствами PHP и GD

Материал из PhpWiki.

Содержание

Сборка

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

Для того, чтобы узнать наличие и используемую версию графической библиотеки, воспользуемся всеми нами, без сомнения, любимой функцией phpinfo(), и взглянем на раздел «GD»:

Если ничего похожего вы не нашли — значит, PHP собран без поддержки графической библиотеки, и придется его пересобирать (или попросить об этом админа).

В противном случае, сначала взглянем на строку «GD Version». Если версия GD — первая (например, 1.6), то часть материала этой статьи вам не подойдет (и, в любом случае, рекомендую обновиться до второй версии). Вторая же версия тоже может быть разная. 🙂 Обратите внимание на слово «bundled». Его присуствие означает, что PHP собран с библиотекой GD, поставляемой вместе с PHP: именно эту библиотеку рекомендуется использовать, так как разработчики PHP исправили множество ошибок и недочетов, присущих оригинальной GD. Впрочем, если используется внешняя библиотека (слово «bundled» в строке «GD Version» отсутствует) — ничего страшного, все приведенные ниже примеры будут работать.

В нижеследующих строках мы видим, какие графические форматы поддерживаются данной конфигурацией библиотеки GD. В частности, работа с форматом GIF поддерживается в режиме «только чтение» из-за проблем с лицензированием используемого в GIF алгоритма компрессии.

Итак, если требуется пересборка PHP, следует это и сделать, загрузив при необходимости последнюю версию PHP, и указать при сборке параметр:

Необязательный параметр location указывает путь к внешней библиотеке GD. Если его опустить (в смысле, не указывать) — используется bundled-версия.

Для поддержки работы с шрифтами TrueType, обсуждаемой в главе «Вывод текста. «, также понадобится наличие библиотеки FreeType и следующие параметры конфигурационной строки:

Примечание: Выше подразумевалось, что используется Unix-подобная ОС. Если же PHP установлен локально, да еще и под Windows — то надо просто раскомментить одну строчку в php.ini — надеюсь, догадаетесь, какую. 🙂

Генерация изображения с помощью PHP

Надеюсь, вы прекрасно осознаете, что нельзя вот так вот просто взять и вывести картинку посреди HTML-кода в том же самом скрипте (если не осознаете, прочтите внимательно эту статью): в HTML-документе мы разместим, как и обычно, тэг , а в его атрибуте src укажем не картинку, как обычно, а PHP-скрипт:

Теперь приступим к написанию этого самого image.php.

Заголовок. Он же header.

Прежде всего, как броузер узнает, что image.php — это не HTML-документ и не что-то еще, а картинка?

Тип документа броузер определяет по заголовку Content-type. На самом деле, этот заголовок — обязательный и всегда присуствует; по умолчанию, PHP услужливо «отдает» заголовок Content-type: text/html. Обычно это поведение PHP нам прекрасно подходит — но не в данном случае. Придется нам вывести нужный заголовок самим:

Приступим теперь непосредственно к генерации картинки.

Создание изображения

Для создания изображения, в нашем распоряжении две функции:

1. imagecreate(). С помощью этой функции можно создать изображение на основе палитры, содержащей фиксированный набор цветов. Каждый цвет палитры необходимо описать с помощью функции imagecolorallocate(). Этот способ создания изображения был единственным при работе с первой версией GD, и необходим при работе с ориентированными на палитру форматами, такими как GIF. Однако введенный во второй версии (и отныне рекомендуемый разработчиками) способ, на мой взгляд, гораздо более удобен.

2. imagecreatetruecolor(). Эта функция создает TrueColor-изображение, то есть цвет каждой точки определяется произвольным цветом, задаваемым в координатах RGB. Помимо того, что это удобнее, чем работа с палитрой, такой подход позволяет производить масштабирование изображения с гораздо меньшими потерями качества. Но об этом позже. Сейчас просто создадим изображение:

Функция imagecreatetruecolor (как, кстати, и функция imagecreate), принимает два обязательных целочисленных параметра — ширину (в нашем примере — 80 пикселей) и высоту (60 пикселей) картинки, и возвращает идентификатор ресурса (в данном случае — изображения), который мы присваиваем переменной $image, которой в дальнейшем будем постоянно пользоваться.

Если по какой-либо страшной причине (недостатке памяти, например) создать изображение не получается, функция возвращает false — в этом случае мы прерываем работу скрипта.

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

Немножко порисуем

Итак, с помощью функции imagecreatetruecolor() мы создали «труколорное» и, если верить документации, черное изображение размером 80×60. Так что, те, в чьи планы входит создание Web-галереи репродукций «квадрата Малевича», могут смело переходить к следующей главе. 🙂 Для остальных, продолжим. Нарисуем на картинке что-нибудь содержательное.

Палка, палка, огуречик, вот и вышел человечек 🙂

Используемые для рисования функции весьма просты для понимания. Их описание (как и описание всех GD-функций) вы найдете здесь. В случае трудностей с английским, просто «поиграйтесь», меняя значения параметров — как вы, несомненно, уже догадались, это ни что иное, как координаты, и цвета в виде 0xRRGGBB.

Подробнее же мы разберем вот эту строку: imagepng($image);

Выше мы создали в памяти изображение, и всячески над ним извращались. 🙂 Это мы делали без привязки к какому-либо выходному формату — просто работали с набором байтов в памяти. А вот функции вида imageформат (imagepng(), imagejpeg(), imagewbmp(). ) генерируют на основе этого самого набора байтов, на который ссылается идентификатор $image, картинку в соответствующем формате, и выводят ее в выходной поток — то бишь, проще говоря, в броузер.

Нелишне здесь вспомнить и о строке header(‘Content-type: image/png’), где мы указали тип документа — обратите внимание: здесь png, и там png. 🙂 Справедливости ради, надо заметить, что большинство броузеров воспринимают только часть «image» этого заголовка, а формат самой картинки уже определяют по ее заголовкам, характерным для каждого формата; однако, лучше все же не надеяться на «интеллект» броузера и указывать правильный формат изображения.

Вывод текста

. а также диаграммы и коллекционеры марок.

Используя полученные в результате рисования смайликов знания, попробуем порисовать диаграммы, а заодно и научимся выводить на картинках текст (не забудьте только о библиотеке FreeType, о необходимости наличия которой сказано в главе «Сборка».

Предположим, вы располагаете следующей важной статистической информацией о коллекционерах почтовых марок:

. и горите желанием представить эту информацию в виде «столбиков» — для удобного сравнения. Столбики мы рисовать уже умеем — стоит только немножко вспомнить азы арифметики:

Обратите внимание на строку imagestring($image, 1, GRAPH_OFFSET_LEFT / 2, $Y — 4, $value, 0x000000); с помощью которой мы выводим числа на координатной оси. Второй параметр — один из встроенных в GD шрифтов (от 1 до 5, чем больше число — тем крупнее шрифт).

Так зачем же, скажете вы, нам какие-то там TrueType-шрифты и FreeType-библиотеки, если мы и так прекрасно пишем на картинке? А вот затем, скажу я вам, что писать-то мы хотим по-русски, а встроенные шрифты о существовании кириллицы даже и не подозревают. А нам надо бы подписать столбики именно по-русски. Да и выбор встроенных шрифтов невелик.

Итак, нам понадобится:

  • Функция imagettftext(), которая рисует выбранным TrueType-шрифтом на картинке,
  • Какой-нибудь кириллический TrueType-шрифт. Возьмем, например, arial.ttf из всеми нами любимой Винды, да не просто возьмем, а положим его туда, где лежит наш скрипт,
  • Поскольку функция imagettftext() воспринимает кодировку Unicode, но никак не Windows-1251, то нам пригодится вот такая функция для соответствующего преобразования:
  • Функция imagettfbbox(), которая поможет нам вычислить высоту и ширину выводимого шрифтом текста.
Мастер Йода рекомендует:  Представлен IBM Watson Unity SDK для разработки VRAR-игр с использованием ИИ

Тренировка прошла успешно — всех поприветствовали. Можно теперь приступать к нашим диаграммам.

Барабанная дробь. Запускаем.

Изменение размера

. thumbnails, или «превьюшки».

Часто перед веб-разработчиком стоит задача генерации уменьшенных копий изображений для предварительного просмотра; можно даже сказать, что это — одно из самых распространенных применений библиотеки GD.

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

Во второй версии библиотеки, с появлением поддержки TrueColor и imagecreatetruecolor(), введена новая функция — imagecopyresampled(), обеспечивающая весьма достойное качество «превьюшек».

Продемонстрируем работу с этой функцией. Предположим, у нас есть файл original.jpg, допустим, 400×250 пикселей, и мы хотим создать ее уменьшенный вариант small.jpg — 100×60. Можно поступить так:

Этот код работает, однако искажения, получаемые при непропорциональном изменении размера, выглядят не особенно симпатично. Более того, код получился не особенно-то универсальным: мало того, что мы можем работать только с JPEG-файлами, у нас еще и жестко заданы имена файлов и размеры получаемого изображения.

Итак, пусть у нас есть файл в любом поддерживаемом GD формате, и мы хотим создать «превьюшку» заданного размера в формате JPEG. Разработаем для этой цели функцию imgResize. Комментариев здесь почти не будет — так как используются уже изученные приемы и обычная арифметика. Постарайтесь разобраться в этом коде самостоятельно.

Создание сжатых миниатюр изображений с помощью php.

В современном сайтострое очень важна оптимизация скорости загрузки страниц на устройство клиента. И не смотря на растущую каждый год ширину канала этот вопрос становится все более актуальным. Сайты, с момента своего появления сильно изменились, теперь это не просто текст и таблички. В большинстве своем большинство веб ресурсов превратились в сервисы позволяющие не только получить информацию, но и обработать ее на месте совершив с ней какое-либо действие. Например покупка товара, выбор доставки и прочее прочее. Началась борьба за деньги пользователей, а пользователи в современном мире очень сильно не любят ждать. Каждая лишняя секунда загрузки вашего сайта, это возможность потерять клиента и его деньги, что он так яростно желает потратить. Огромную роль в скорости загрузки играет именно контент, а именно картинки. Как часто бывает, что для миниатюр изображений 200x200px используются полновесные картинки весом по 2-3 мегабайта. Одна картинка еще ничего, но если у вас каталог и таких картинок сотни, то подумайте сколько это все будет грузиться в первый раз клиенту, когда он откроет ваш сайт.

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

В примере кода ниже мы используем библиотеку GD, если у вас ее нет, то инструкция по установке тут.

Для начала в корне сайта создадим папку minimage , в ней будут храниться миниатюры наших изображений. Сам скрипт положим так же в корень, плюс разместим несколько картинок, у нас это 12.jpg — 17.jpg.

Ниже приведен полный код страницы, достаточно сохранить его под name.php и запустить на сервере. Если вы сделали все как и мы, то он создаст миниатюры, сохранит их в папку minimage и выведет на странице.


Немного по используемым выше функциям:

  • imagecreatetruecolor — создает новое изображение, мы используем для создание холста
  • imagecreatefromjpeg — создаем новое изображение из файла или по url
  • imagecopyresampled — Копирование и изменение размера изображения с ресемплированием
  • imagejpeg — Выводит изображение в браузер или пишет в файл
  • imagedestroy — уничтожаем изображение после того как сохранили миниатюру.

Работа с графикой в PHP — часть 1

категория
PHP
дата 18.12.2012
автор romchiksoad
голосов 4

Сейчас мы поговорим о создании изображений средствами PHP GD . Давайте приступим сразу к делу.

И так, как и любая картина, в PHP GD все начинается с «приобретения» холста( собственно это то, на чем мы будем воплощать наше произведение искусства в жизнь).

Что бы создать новый холст, в PHP GD существует две очень простые функции:

1) ImageCreate ;

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

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

$ img = ImageCreate( $ width , $ height );

$ img — представляет собой ресурс созданного холста в памяти компьютера;

$ width , $ height — Длина и ширина холста соответственно.

Во втором случае ( ImageCreateTrueColor ) мы создаем полноценное изображение. Это обосновано тем, что ImageCreateTrueColor создает холст в натуральном цвете (черный). От этого и название функции. ImageCreateTrueColor имеет такой же синтаксис, что и ImageCreate.

И так, с созданием холстов мы разобрались. Можем идти дальше.

Что бы рисовать на созданном холсте, нам необходимо определить цвет, которым мы и будем это делать.

Для этого у библиотеки GD есть функция, ImageColorAllocate. Её синтаксис ниже:

$ color = ImageColorAllocate( $ img , $ red , $ green , $ blue );

$color — по сути сам цвет;

$img — ресурс нашего холста в памяти компьютера;

$red, $green, $blue — цвет в формате RGB красный, зеленый, синий соответственно.

Первый цвет который задается функцией ImageColorAllocate автоматом распределяется по всему холсту. Исходя из этого мы уже можем создать простейшее изображение:

$ img = ImageCreate( 100 , 100 );

$ red = ImageColorAllocate( $ img , 255 , 0 , 0 );

//Дальше идет вывод изображения в браузер.

//После этого скрипта, я постараюсь объяснить все что идет после этих комментариев

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

ImagePng( $ img );

Теперь, как я и обещал, постараюсь объяснить то, что идет после комментариев.

И так, перед выводом в браузер или сохранением на жестком диске нашего изображения, мы посылаем заголовок с расширением изображения. В нашем случае это PNG( так же это могут быть: JPEG, GIF, WBMP, GD и GD2 ). Отправленный браузеру заголовок с типом изображения должен соответствовать следующей за ним функцией для вывода/сохранения изображения. В нашем случает это ImagePng. Рассмотрим её синтаксис полностью:

ImagePng( $img, [$file] );

$img — представляет ресурс изображения;

$file — это не обязательный параметр, который сохраняет изображение на жестком диске. В нем должен храниться полный путь и имя картинки, которую вы хотите сохранить.

Если вы заметили, то выше я писал, что посылаемый заголовок должен соответствовать следующей за ним функции. Как тогда вывести/сохранить изображение в тех форматах? Для этого существуют следующие функции, схожие по синтаксису: Image2Wbmp(); Imagejpeg(); ImageGD(); ImageGD2(); ImageGif();

Теперь ваших знаний вполне хватает, что бы создать и вывести/сохранить совсем не нужное изображение:) Что бы это исправить, читаем дальше.

Рисование простейших геометрических фигур.

И так, продолжим. Эту главу мы начнем с построения линии. За это отвечает функция ImageLine(); Её синтаксис:

ImageLine( $img, $start_x, $start_y, $end_x, $end_y, $color );

$img — как и в предыдущих случаях, это ресурс изображения в памяти;

$start_x, $start_y — координаты начальной точки по X и Y соответственно;

$end_x, $end_y — координаты конечной точки по X и Y соответственно;

$color — цвет линии, который создан ImageColoAllocate() .

Рассмотрим на примере:

$ img = ImageCreate( 100 , 100 ); // Создаем холст

$ black = ImageColorAllocate( $ img , 0 , 0 , 0 ); //Задаем фоновый цвет

$ red = ImageColorAllocate( $ img , 255 , 0 , 0 ); //Определяем цвет линии

ImageLine( $ img , 10 , 15 , 90 , 85 , $ red ); //Рисуем линию

header( ‘Content-type: image/gif’ );

ImageGif( $ img , «images/first_img.gif» );

Думаю, что по комментариям всё предельно ясно. Кстати, в расширении GD система координат имеет не совсем привычный для общества вид. Она как бы перевернута вверх ногами. Если возникнут вопросы, то можете их задать на форуме. Идем дальше:)

Теперь давай те рассмотрим функции для рисования многоугольников и прямоугольников.

В PHP GD существует 2 функции для рисования подобных вещей: для многоугольников это ImagePolygon(); , а для прямоугольников это ImageRectAngle(); . Продолжим по порядку. Сначала рассмотрим многоугольники.

Особенностью построения многоугольников является то, что функция ImagePolygon(); принимает массив с координатами и их количество. Рассмотрим на примере:

Думаю основы понятны. Я старался все объяснить в комментариях.

Теперь давайте перейдем к разбору прямоугольников:)

Для построения прямоугольников, как я уже говорил выше, предназначена функция ImageRectAngle(); Её мы также рассмотрим не примере:

Останавливаться на этом не будем. Я надеюсь, что вам понятны мои комментарии.

Самое время перейти рисованию окружностей:)

Для этого в расширении GD существуют следующие функции: ImageArc() ; и ImageEllipse() ;

Начнем с примера по проще:

$w > 100 ; //Ширина изображения

$height = 100 ; //Высота изображения

$img = ImageCreate( $width, $height ); // Создаем холст

$white = ImageColorAllocate( $img, 255 , 255 , 255 ); //Задаем фоновый цвет

$black = ImageColorAllocate( $img, 0 , 0 , 0 ); //Задаем цвет для линии окружности

$color = ImageColorAllocate( $img, 100 , 100 , 100 ); //Еще один цвет

$center_x = ( int )$width / 2 ; //Определяем центр по X. Эта переменная не обязательно должна находиться по центру

$center_x_1 = ( int )$width / 4 ; //Центр второй окружности по X для наглядности

$center_y = ( int )$height / 2 ; //Центр окружности по Y

$rad_1 = 50 ; //Ширина окружности

$rad_2 = 20 ; //Высота оружности

ImageEllipse( $img, $center_x, $center_y, $rad_1, $rad_2, $black ); //Рисуем окружности

ImageEllipse( $img, $center_x_1, $center_y, $rad_2, $rad_1, $color );

//Выводим изображение в брвузер

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

И последняя на сегодня функция ImageArc() ; , которую мы так же рассмотрим на примере:

$w > 100 ; //Ширина изображения

$height = 100 ; //Высота изображения

$img = ImageCreate( $width, $height ); // Создаем холст

$white = ImageColorAllocate( $img, 255 , 255 , 255 ); //Задаем фоновый цвет

Мастер Йода рекомендует:  Что же такое виртуальный сервер, и с чем его едят

$black = ImageColorAllocate( $img, 0 , 0 , 0 ); //Задаем цвет для линии окружности


$color = ImageColorAllocate( $img, 10 , 200 , 255 ); //Еще один цвет

$center_x = ( int )$width / 2 ; //Определяем центр по X. Эта переменная не обязательно должна находиться по центру

$center_x_1 = ( int )$width / 4 ; //Центр второй окружности по X для наглядности

$center_y = ( int )$height / 2 ; //Центр окружности по Y

$rad_1 = 50 ; //Ширина окружности

$rad_2 = 20 ; //Высота окружности

$ang_start = 0 ; //Эта функция отличается от предыдущей тем, что с помощью нее можно нарисовать дугу.

$ang_end = 360 ; //благодаря двум новым параметрам, которые представляют собой угол окружности

ImageArc( $img, $center_x, $center_y, $rad_1, $rad_2, $ang_start, $ang_end, $black ); //Рисуем окружность

ImageArc( $img, $center_x_1, $center_y, $rad_2, $rad_1, $ang_start + 100 , $ang_end — 60 , $color ); //Рисуем дугу

//Выводим изображение в браузер

header( ‘Content-type: image/jpeg’ );

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

Если Вам понравилась статья, проголосуйте за нее

PHP работа с изображениями

Здравствуйте, уважаемые читатели блога LifeExample, прошло много времени с публикации предыдущей статьи и вот у меня появилось время пополнить коллекцию моих публикаций новым уникальным и полезным контентом. В этом посте я хочу привести пример работы с изображениями на php. Данная статья навеяна мне задачами по разработке интернет магазина на Moguta.CMS.

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

Научившись применять основные из функций php библиотеки GD (Graphics Draw) я нашел ей применение в решении одной задачи, суть которой сводится к выравниванию масштаба всех изображений в наборе.

Дано: набор изображений для товаров интернет магазина.

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

Задача: нормализовать все картинки и получить из выше приведенного набора следующий результат.

Получившиеся изображения товаров должны быть, все одного разрешения и одного масштаба.

Решение задачи ( PHP работа с изображениями )

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

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

  1. Вычислить размеры холста изображения;
  2. Вычислить ширину и высоту товара на изображении;
  3. Вычислить пропорции для сжатия холста вместе с изображением товара;
  4. Если товар на холсте меньше эталонного, то не сжимать его;
  5. Создать итоговый холст с нужными размерами и поместить в его центр получившуюся при сжатии картинку.

Выполнив каждый пункт текущего алгоритма, на выходе мы получим нормализованные картинки одинакового размера и масштаба.

Как вычислить размеры внутреннего рисунка на холсте

Самой сложной из подзадач является, поиск габаритов изображения:

На приведенном рисунке

  • P0 – точка начала области изображения товара
  • H1- высота товара
  • W1- ширина товара
  • H2- расстояние от верхней границы холста до точки P0
  • W2- расстояние от левой границы холста до точки P0
  • H3- высота всего изображения картинки товара
  • W3- ширина всего изображения картинки товара

Чтобы определить все неизвестные нам параметры, мы воспользуемся как встроенными средствами PHP по работе с изображениями, так и собственным «велосипедом».

Найти H3 и W3 можно php функцией getimagesize() , но как бы нам вычислить H1 и W1? Что если мы вернемся к статье по распознаванию капчи? Возьмем из этой статьи алгоритм преобразования изображения в бинарную матрицу.

Бинарная матрица – это представления изображения в виде единиц и нулей, все пикселы изображения отличающиеся от фонового цвета получат значение = 0 , а пикселы составляющие само изображение будут равны 1, в итоге мы получим такую матрицу:

Теперь мы можем запросто вычислить интервалы, в которых находятся 1-цы, о том как это сделать читайте в статье по распознаванию капчи.

После того как нам станут известны все необходимые параметры, можно будет выполнять наш алгоритм нормализации картинок.

В готовом виде PHP скрипт будет выглядеть так:

/**
* Класс нормальзующий картинку по заданному разрешению
*/
class imageWorker <

public $baseWidth = 150 ; // длина эталонного изображения (именно товара внутри картинки)
public $baseHeight = 119 ; // высота эталонного изображения (именно товара внутри картинки)
public $outImageWidth = 600 ; // длина изображения после обработки
public $outImageHeight = 400 ; // высота изображения после обработки
public $im = null ; // дескриптор картитнки
public $binaryMartix = null ; // матричное представление картитнки
public $saveBinaryMartixTofile = false ; // сохранять матричное представление картитнки в файл
public $dir = ‘image/source/’ ; // расположения набора картинок
public $saveMartix = false ; // сохранять матричное представление картитнок
public $extensions = array ( «» , «gif» , «jpeg» , «png» ) ; // допустимые картинки
public $curImageWidth = 1 ; // ширина обрабатываемого изображения
public $curImageHeight = 1 ; // высота обрабатываемого изображения
public $imgFunctionProcess = «imagecreatefromjpeg» ; // функция для работы с изображением
public $curExt = «» ; // расширение картинки
public $curImageName = «» ; // расширение картинки
public $dirUpload = ‘image/result/’ ; // папка для выгрузки (должна быть создана)

function __construct ( $path , $w , $h ) <
$this -> outImageWidth = $w ;
$this -> outImageHeight = $h ;
$this -> curImageName = $path ;

list ( $this -> curImageWidth , $this -> curImageHeight , $type ) = getimagesize ( $this -> dir . $path ) ; // Получаем размеры и тип изображения (число)
$ext = $this -> extensions [ $type ] ;
if ( $ext ) <
$this -> imgFunctionProcess = ‘imagecreatefrom’ . $ext ; // Получаем название функции, соответствующую типу, для создания изображения
$func = $this -> imgFunctionProcess ;
$this -> curExt = $ext ;
$this -> im = $func ( $this -> dir . $path ) ; // Создаём дескриптор для работы с исходным изображением
if ( ! $this -> im ) <
return false ;
>
> else <
echo ‘Ошибка: Неизвестный формат изображения!’ ;
return false ;
>

$this -> binaryMartix = $this -> imageToMatrix ( $this -> im , false ) ;

if ( $this -> saveBinaryMartixTofile ) <
$this -> printMatrix ( $this -> binaryMartix ) ;
>

$res = $this -> explodeMatrix ( $this -> binaryMartix ) ;
$width = $res [ ‘resultInterval’ ] ;
$cropX = $res [ ‘startInterval’ ] ;

$this -> binaryMartix = $this -> imageToMatrix ( $this -> im , true ) ;
$res = $this -> explodeMatrix ( $this -> binaryMartix ) ;
$height = $res [ ‘resultInterval’ ] ;
$cropY = $res [ ‘startInterval’ ] ;

$result = «Размеры изображения (» . $path . «)
w > . $this -> curImageWidth . «px;
height=» . $this -> curImageHeight . «px;» ;
$result .= «
Размеры изделия внутри изображения
w > . $width . «px;
height=» . $height . «px;» ;
$result .= «
Коэффициенты сжатия
w > . $this -> baseWidth / $width . «px;
height=» . $this -> baseHeight / $height . «px;» ;
$result .= «
Отрезать картинку с точки
cropX=» . $cropX . »
cropY=» . $cropY . » » ;

//$this->crop(«2.png», $cropY, $cropX, $width, $height); // Вызываем функцию
//$this->reSizeImage($name, $ext, $tmp, 0.3);
echo $result ;
if ( $this -> baseHeight $height ) <
$this -> resizeImage ( $this -> baseHeight / $height ) ;
> else <
$this -> resizeImage ( 1 ) ;
> ;

imagedestroy ( $this -> im ) ;
>

function explodeMatrix ( $binaryMartix ) <
$temp = array ( ) ;

// сложение столбцов для выявления интервалов
for ( $i = 0 ; $i count ( $binaryMartix ) ; $i ++ ) <
$sum = 0 ;
for ( $j = 0 ; $j count ( $binaryMartix [ 0 ] ) ; $j ++ ) <
$sum += $binaryMartix [ $i ] [ $j ] ;
>
$temp [ ] = $sum ? 1 : 0 ;
>

// вычисление интервалов по полученной строке
$start = false ;
$countPart = 0 ;
$arrayInterval = array ( ) ;
foreach ( $temp as $k => $v ) <

//отсеиваем помехи (мелкие интервалы), Большая картинка, всяко больше 20px.

$resultInterval = 1 ;
$startInterval = 1 ; // начало интервала
foreach ( $arrayInterval as $key => $interval ) <
if ( ( $interval [ ‘end’ ] — $interval [ ‘start’ ] ) > 20 ) <
$resultInterval = $interval [ ‘end’ ] — $interval [ ‘start’ ] ;
$startInterval = $interval [ ‘start’ ] ;
>
>
return
array (
‘resultInterval’ => $resultInterval ,
‘startInterval’ => $startInterval
) ;
>

/**
* Конвертация рисунка в бинарную матрицу
* Все пиксели отличные от фона получают значение 1
* @param imagecreatefrompng $im — картинка в формате PNG
* @param bool $rotate — горизонтальная или вертикальная матрица
*/
function imageToMatrix ( $im , $rotate = false ) <
$height = imagesy ( $im ) ;
$width = imagesx ( $im ) ;

if ( $rotate ) <
$height = imagesx ( $im ) ;
$width = imagesy ( $im ) ;
>

$background = 0 ;
for ( $i = 0 ; $i $height ; $i ++ )
for ( $j = 0 ; $j $width ; $j ++ ) <

if ( $rotate ) <
$rgb = imagecolorat ( $im , $i , $j ) ;
> else <
$rgb = imagecolorat ( $im , $j , $i ) ;
>

//получаем индексы цвета RGB
list ( $r , $g , $b ) = array_values ( imageColorsForIndex ( $im , $rgb ) ) ;

//вычисляем индекс красного, для фона изображения
if ( $i == 0 && $j == 0 ) <
$background = $r ;
>
//echo «red=».$background;
$sensitivity = 15 ;
// если цвет пикселя не равен фоновому заполняем матрицу единицей
$binary [ $i ] [ $j ] = ( $r > $background — $sensitivity ) ? 0 : 1 ;
>
return $binary ;
>

/**
* Выводит матрицу на экран
* @param type $binaryMartix
*/
function printMatrix ( $binaryMartix ) <
$return = » ;
for ( $i = 0 ; $i count ( $binaryMartix ) ; $i ++ ) <
$return .= » \n » ;
for ( $j = 0 ; $j count ( $binaryMartix [ 0 ] ) ; $j ++ ) <
$return .= $binaryMartix [ $i ] [ $j ] . » » ;
>
>
file_put_contents ( $this -> dirUpload . $this -> curImageName . «.txt» , $return ) ;
>

/**
* Функция для ресайза картинки
* @paramint $koef коэффициент сжатия изображения
* @return void
*/
public function resizeImage ( $koef ) <
// получение новых размеров
$newWidth = $koef * $this -> curImageWidth ;
$newHeight = $koef * $this -> curImageHeight ;
// ресэмплирование
$image_p = imagecreatetruecolor ( $this -> outImageWidth , $this -> outImageHeight ) ;
//делаем фон изображения белым, иначе в png при прозрачных рисунках фон черный
$color = imagecolorallocate ( $image_p , 255 , 255 , 255 ) ;
imagefill ( $image_p , 0 , 0 , $color ) ;
imagecopyresampled (
$image_p , $this -> im , ( $this -> outImageWidth — $newWidth ) / 2 , ( $this -> outImageHeight — $newHeight ) / 2 , 0 , 0 , $newWidth , $newHeight , $this -> curImageWidth , $this -> curImageHeight
) ;
$func = «image» . $this -> curExt ;
$func ( $image_p , $this -> dirUpload . $this -> curImageName ) ;
imagedestroy ( $image_p ) ;
>

> // конец тела класса

/**
* Массив имен файлов
*/
$imagesName = array (
‘kameya_medium_1005858593.jpg’ ,
‘kameya_medium_1005862834.jpg’ ,
‘km0210-3_small.jpg’ ,
‘sd0202066_small.jpg’ ,
) ;

/**
* Перебор массива имен файлов и нормализация изображений
*/
foreach ( $imagesName as $image ) <
if ( file_exists ( ‘image/source/’ . $image ) ) <
// каждую картинку нормальзуем и приведем к разрешению 200×200 пикселей
$encrypt = new imageWorker ( $image , 200 , 200 ) ;
> else <
continue ;
>
>

Данный скрипт PHP работает с изображениями из папки image/source/ и по результату своего выполнения складывает нормализованные картинки в папку image/result/ .

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

Создание изображение с текстом на php

Пытаюсь сделать изображение с текстом на языке PHP

26.03.2020, 10:34

Gd библиотека. Не сохоаняет изображение с введенным текстом через $_POST
Всем привет. Мне понадобилась ваша помощь, ситуация следующая. Я хочу сделать онлайн генератор.

Мастер Йода рекомендует:  Регистрация в Одноклассниках и вход на свою страницу

Работа с текстом PHP
Помогите пожалуйста. Дан текст. Разбить его на строки (длина строк дана) так, чтобы разделение.

Изображение рядом с текстом HTML
Добрый день, в футере нужно вывести лого компании и просто строку текста рядом. Не понимаю, как.

Изображение с текстом перевести в текст
нужна прога(для перевода фото). состоязщая из двух окон. Сверху чобы открывался tif,pdf. а снизу.

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

Работа с изображениями на PHP

Уважаемые участники проекта ДвижКод! Сегодня вас ждёт еще одна интересная тема. Все мы привыкли, скажем, загружать новые аватарки в социальных сетях. Но как они масштабируются до нужных размеров? Что происходит на сервере? На эти и многие другие вопросы ответы вас ждут под катом.

Да, если кто не в курсе, то в интернет-терминологии «кат» (от англ. cut — резать), это место, которое разделяет новость на краткое (в общем списке) и полное представления.

Многие знают, что я разрабатываю собственную систему управления сайтами под названием Когир (Cogear, https://cogear.ru). История сложная и длинная, но упорно иду к поставленной цели.

Недавно мне пришлось переписывать ранее написанные классы для работы с изображениями, поэтому я решил с вами поделиться тем, как всё это делается. Милости прошу на кухню.

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


В PHP есть встроенная библиотека GD. Вот её документация:

На этой странице вы найдете огромное количество самых разных функций. Но не пугайтесь. Нас интересуют вполне конкретные.

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

Простейший пример работы с изображением:

Пробуем на локальной машине.

Создаём файл image.php(у меня для экспериментов локальный домен test.local).

Кладём в корень папки сайта test.local картинку 1.jpg:

Вызываем в браузере https://test.local/image.php (в вашем случае — другой адрес).

Обнаруживаем в папке картинку 2.jpg:

Пропорции не сохранились, как видите. Потому что мы их не пересчитали.

Исправим наш скрипт так, чтобы происходил пересчёт:

Посмотрим на результат:

Поскольку мы пересчитывали по высоте, то часть конечного изображения оказалась черной (изначальный цвет созданного полотна).

Что еще можно делать с изображением? Подрезать его, поворачивать, наслаивать одно на другое, рисовать на нём.

Уверен, что вам будет интересен мой класс для работы с изображениями. Он вне системы не работает, так как является драйвером для шестерёнки (модуля) «Изображения».

Но вы найдете в нём для себя много интересного:

Как он работает в системе? Ради чего столько кода?

Понимаете? Работает со всеми нужными форматами автоматически. Функционал при необходимости можно расширять.

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

Поделиться

Комментарии Правила дискуссии

  1. Участники дискуссии уважительно относятся друг к другу и к автору блога.
  2. Мат недопустим. Учитесь вести диалог культурно.
  3. Реклама и спам запрещены.

Если вы не соблюдаете эти три простых правила, то ваши комментарии удаляются без предупреждения.

Во всем остальном вам предоставляется полная свобода слова и выражения собственного мнения.

Создаём Instagram фильтры с помощью PHP и ImageMagick

В этой статье я покажу как создать некоторые эффекты на фотографиях (как на Instagram) с помощью PHP и ImageMagick.

Обработка изображений с помощью PHP

PHP поставляется в комплекте с GD (GIF Draw / Graphics Draw). Её используют для простых операций с изображениями, такие как изменение размера, обрезка, добавление водяных знаков, создание миниатюр. К сожалению, если вы хотите создать что-то более сложное с GD не получится. К счастью, у нас есть ImageMagick!

GD vs. ImageMagick

Посмотрим на примере ресайза изображения.

IM (сокращенно от ImageMagick) имеет хорошую оболочку, называется Imagick — родное расширение PHP для создания и редактирования изображений с помощью ImageMagick API. Единственный минус: устанавливается из PECL, который иногда может быть проблемой для виртуального хостинга.

А с применением командной строки еще проще:

Установка ImageMagick

Пройдите по ссылке, выберите платформу (Unix / Mac / Win) и выберите рекомендуемый пакет.

После завершения установки перейдите к терминалу/командной строке, введите convert и нажмите Enter, если вы получите список вариантов, а не «Команда не найдена», то все отлично! Обратите внимание, что вам не нужно ничего настраивать в PHP.

Instagraph — класс PHP

Я создал небольшой скрипт, PHP класс, чтобы сделать процесс фильтрации изображений как можно более простым.

  1. colortone: воля цветового тона изображения в светах и/или тени.
  2. vignette: края изображения обесцвечиваются.
  3. border: добавляет границы к фотографии.
  4. frame: будет читать заданный кадр в соответствии с фото.
  5. tempfile: создает временный файл (копия оригинального изображения).
  6. output: переименование рабочего файла
  7. execute: посыл команды

Создайте новый файл с именем instagraph.php и вставьте следующий код.

Посмотрим что получается

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

Напоминает старые снимки Polaroid, он имеет яркие цвета вместе с розовым/оранжевым свечением от центра. По словам генерального директора Instagram, это один из самых сложных эффектов.

Вы даже можете добавить белую рамку для полного эффекта, просто добавьте

Как это использовать?

Я предполагаю что вы сохранили весь код в файл instagraph.php. Теперь создайте файл с именем filter.php и скопируйте следующий код.

Если вы хотите применить только один фильтр, вы можете сделать это следующим образом:

Вот и все! Если вы хотите применить все фильтры используйте этот код:

Производительность

Производительность, безусловно, является важной частью в любой области применения. Применение фильтра к изображению составляет примерно 1 секунду, мы можем с уверенностью сказать что это очень быстро!

PHP Image Workshop: простая работа с изображениями как со слоями

Какие задачи по обработке картинок на php чаще всего стоят перед нами? Как правило, это изменение размера изображений, их кадрирование, наложение водяных знаков и надписей, поворот, изменение формата. В поисках лучшей библиотеки для работы с изображениями на php я перепробовал немало готовых решений, и даже начинал писать своё. Не так давно я наткнулся на библиотеку под названием PHP Image Workshop — PHP класс, использующий библиотеку gd, позволяющий работать с изображениями как со слоями (по аналогии с известными программами Photoshop и GIMP). Звучит неплохо, да? Вот и я решил попробовать.

Разработчики PHP Image Workshop предлагают использовать принцип построения изображения из слоёв, являющихся php объектами, которые можно делить на группы, перемещать, вращать, накладывать и объединять. Сегодня я расскажу как подключить этот класс в свой скрипт, а так же покажу простой пример построения коллажа с его помощью.

Подключение РHP Image Workshop

Скачиваем последнюю версию (на текущий момент это версия 2.0) c сайта разработчика, выгружаем на сервер папку /src/PHPImageWorkshop из архива. Теперь, в зависимости от версии php, типа скрипта, знаний и количества свободного времени, выбираем один из вариантов.

У меня php 5.3+ и используется автозагрузчик классов

Великолепно! Разработчики Image Workshop, за что им честь и хвала, использовали технологию пространств имён (namespaces). Осталось только расположить папку PHPImageWorkshop в директорию с библиотеками, с которой работает автолоадер.

К примеру, чтобы подключить PHP Image Workshop к Yii Framework, нужно загрузить её в директорию расширений (обычно это /protected/extensions) и добавить в action пару строк кода:

У меня php 5.3+ и я знать не хочу ни про какие автозагрузчики

Проще было узнать об автозагрузке, но, раз на то пошло, такой вариант тоже предусмотрен. Нужно один за другим, во всех подпапках открыть файлы классов библиотеки и раскомментировать вызов //require_once() в начале каждого файла. Вот пример:

После этого нужно подключить файл главного класса ImageWorkshop в коде своего скрипта:

У меня php 5.2 или ниже

Не завидую 🙁 Можно сплясать и поудалять все вкрапления namespaces из всех классов библиотеки. Инструкции можно найти тут, но проще обновить php.

Использование PHP Image Workshop

Есть два варианта использовать класс Image Workshop. Первый — создать псевдоним для имени класса ImageWorkshop и обращаться к этому псевдониму:

Второй вариант — каждый раз прописывать путь до класса вместе с пространством имён (для меня удобен именно он):

Инициализация слоя

Наложение слоёв

Изменение размера слоя

Поворот слоя

Создание и добавление текстового слоя

Сохранение изображения

Отображение сформированного изображения

Позиционирование

В некоторых методах PHP Image Workshop позиционирование и точка отсчёта кординат определяется строкой $position, состоящей из двух букв. На схеме ниже показаны все возможные варианты позиционирования. Стрелки указывают направление, в котором будут отсчитываться координаты в случае указания той или иной позиции:

Пример использования PHP Image Workshop для создания коллажа

Представим, что нам нужно сделать модный коллаж. У нас есть фон collageBackground.jpg:

На этот фон нужно наложить, уменьшив размер и повернув, 4 фотографии одежды collageImage1.jpg. collageImage4.jpg:

Затем, поверх фотографий, нужно наложить такую вот маску collageMask.png, а поверх — написать цену 6 296 руб. Для добавления надписей потребуется файл шрифта. В данном случае — OpenSans-Bold.ttf:

Вот, собственно, сам код для создания коллажа:

А вот и результат!

В этой статье показаны только основные возможности PHP Image Workshop. Для ознакомления с полным списком необходимо заглянуть на страницу документации на сайте разработчика.

Создание изображение с текстом на php

Пытаюсь сделать изображение с текстом на языке PHP

26.03.2020, 10:34

Gd библиотека. Не сохоаняет изображение с введенным текстом через $_POST
Всем привет. Мне понадобилась ваша помощь, ситуация следующая. Я хочу сделать онлайн генератор.

Работа с текстом PHP
Помогите пожалуйста. Дан текст. Разбить его на строки (длина строк дана) так, чтобы разделение.

Изображение рядом с текстом HTML
Добрый день, в футере нужно вывести лого компании и просто строку текста рядом. Не понимаю, как.

Изображение с текстом перевести в текст
нужна прога(для перевода фото). состоязщая из двух окон. Сверху чобы открывался tif,pdf. а снизу.

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

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