php информация об изображении
Функции графических изображений
PHP не ограничен только созданием HTML вывода. PHP может также использоваться для создания и управления различными форматами изображений, включая GIF, PNG, JPG, WBMP, и XPM. Для большего удобства, PHP может вывести потоки изображения непосредственно в браузер. Для того, чтобы использовать замечательную возможность создания изображения с помощью PHP, вам необходимо иметь библиотеку функций изображений GD. GD и PHP может также требовать других библиотек, в зависимости от того, с какими форматами изображений вы хотите работать.
Вы можете использовать функции изображений в PHP, чтобы получить возможность работать с JPEG, GIF, PNG, SWF, TIFF и изображениями JPEG2000.
Замечание: Читайте раздел требований о том, как развернуть возможности читать изображения, сохранять, изменять изображения и читать мета данные изображений, представленных цифровыми камерами.
Формат изображений, которыми вы можете управлять, зависит от версии GD, который вы устанавливаете. Версии GD старше, чем gd-1.6 поддерживают формат GIF, и не поддерживают PNG, а версии больше чем gd-1.6 и меньше чем gd-2.0.28 поддерживают PNG, но не поддерживают GIF. Поддержка формата GIF вновь стала возможной в gd-2.0.28.
Замечание: Для PHP, начиная с PHP 4.3, есть связанная версия GD lib. Эта связанная версия имеет некоторые дополнительные особенности подобно alpha blending, и должна использоваться в предпочтении к внешней библиотеке, так как ее код оптимизирован для PHP и более устойчив.
Вы можете захотеть расширить GD, чтобы иметь возможность работать с большим числом форматов изображений.
Таблица 1. Поддерживаемые форматы изображений
Формат | Библиотеки для скачивания | Примечания |
---|---|---|
gif | Поддерживаются только GD версий старше gd-1.6 и новее, чем gd-2.0.28. Только для чтения поддержка GIF доступна с PHP 4.3.0 связанной библиотекой GD. Поддержка записи доступна с PHP 4.3.9 aи с PHP 5.0.1. | |
jpeg-6b | ftp://ftp.uu.net/graphics/jpeg/ | |
png | http://www.libpng.org/pub/png/libpng.html | Поддерживается только библиотеками GD версий выше, чем gd-1.6. |
xpm | ftp://metalab.unc.edu/pub/Linux/libs/X/!INDEX.html | Вероятно, что у вас есть эта библиотека, если ваша система имеет установленную X-среду. |
Вы можете желать расширить GD, чтобы иметь дело с различными шрифтами. Следующие библиотеки шрифта поддерживаются:
Таблица 2. Поддерживаемые библиотеки шрифтов
Библиотека шрифтов | Ресурсы для скачивания | Примечания |
---|---|---|
FreeType 1.x | http://www.freetype.org/ | |
FreeType 2 | http://www.freetype.org/ | |
T1lib | ftp://sunsite.unc.edu/pub/Linux/libs/graphics/ ) | Поддержка шрифтов Type 1. |
Замечание: Для включения поддержки exif в Windows, php_mbstring.dll должен быть загружен перед php_exif.dll в php.ini.
Таблица 3. Поддерживаемые форматы изображений
Замечание: Когда вы компилируете PHP с libpng, вы должны использовать одинаковые версии, связанные с библиотекой GD.
Таблица 4. Поддерживаемые библиотеки шрифтов
Данное расширение не определяет никакие типы ресурсов.
Перечисленные ниже константы определены данным расширением и могут быть доступны только в том случае, если PHP был собран с поддержкой этого расширения или же в том случае, если данное расширение подгружается во время выполнения.
Введение
Замечание: Прочитайте раздел требований, чтобы узнать, как расширить возможности чтения, записи и модификации изображений. Чтобы иметь возможность читать мета-данные изображений, взятых с цифровых фотоаппаратов нужно, уже упомянутый модуль EXIF.
Замечание: Функция getimagesize() не требует наличия библиотеки GD.
Тогда как поставляемая с PHP библиотека GD использует менеджер памяти Zend, то системная нет. Соответственно ограничение memory_limit не работает.
GD поддерживает ряд форматов. Ниже приведён список этих форматов и пометки о доступности, включая поддержку чтения и записи.
Формат | Поддержка чтения | Поддержка записи | Примечания |
---|---|---|---|
JPEG | true | true | |
PNG | true | true | |
GIF | true | true | |
XBM | true | true | |
XPM | true | false | |
WBMP | true | true | |
WebP | true | true | |
BMP | true | true | Доступно с GD 2.1.0 и PHP 7.2.0 |
Как определить дубликаты картинок с помощью PHP
В любом проекте человеческий фактор никто не отменял, и если пользователи самостоятельно грузят картинки на сайт – появления дубликатов не избежать. Когда доходит до тысяч файлов, глазами всего не пересмотреть, а повторяющиеся картинки мало того, что никому не нужны, так еще и занимают место, тратят ресурс и в конце концов тормозят работу.
Потому рано или поздно встает вопрос автоматизации процесса поиска повторов, и тут мы рассмотрим основные, а также попробуем в деле.
Сравнение файлов через функцию hash
Одним из способов определения дубликатов является сравнение файлов путем генерации хеш-значения из содержимого заданного файла.
Простой пример вычисления хеша изображения:
Результат выглядит примерно так: bff8b4bc8b5c1c1d5b3211dfb21d1e76
Если хеши двух изображений совпадают – изображения одинаковые.
Метод далеко не самый точный, так как работает только для идентичных картинок, при малейшем различии — толку ноль.
ImageMagick
Функция обработки изображений Imagick::compareImages возвращает массив, который содержит восстановленное изображение и разницу между изображениями.
Пример использования при сравнении двух изображений:
В итоге две сравниваемые картинки лепятся в одну, на которой видны отличия.
Также можно получить числовое выражение отличий по каждому параметру (пример с оф.сайта):
gd2 и libpuzzle
Для быстрого поиска дубликатов необходимо установить библиотеки gd2 и libpuzzle.
Libpuzzle создана для быстрого поиска визуального сходства изображений (GIF, PNG, JPEG). Сначала растровая картинка разбивается на блоки — автоматически отбрасываются рамки, не несущие особо значимой информации. Разница между смежными блоками формирует вектор — это так называемая подпись картинки. Похожесть картинок определяется расстоянием между двумя такими векторами. Потому обычно изменение цвета, ресайз или сжатие не влияют на результаты, выдаваемые libpuzzle.
Libpuzzle довольно проста в использовании. Вычисление подписи для двух изображений:
Вычисление расстояния между подписями:
Проверка изображений на схожесть:
Сжатие подписей для хранения в базе данных:
Перцептивный хеш
Вероятнее всего, самый точный способ нахождения дубликатов — сравнение файлов через перцептивный хеш. Проверка на схожесть проводится путем подсчета количества отличающихся позиций между двумя хешами, это расстояние Хэмминга. Чем расстояние меньше — тем больше совпадение.
Отличается от первого способа тем, что указывает не только на одинаковость/неодинаковость, но и на степень различия. Подробнее об этом принципе можно прочитать в неплохом переводе.
Установка для UNIX платформ выглядит так:
Попробовать на деле можно через i.onthe.io/phash. Загрузка изображений через интерфейс и на выходе показатель «одинаковости».
Как это работает
Получаем хеш первого изображения:
Получаем хеш второго изображения:
Получаем расстояние Хэмминга между двумя изображениями:
Мы проделали почти все возможные манипуляции с одной и той же фотографией, чтобы проверить — какие изменения мешают определять дубликаты через pHash, а какие — нет.
Например, при зеркальном отражении — картинка остается неузнанной.
Зато с цветами можно играться сколько угодно — на результат сравнения это не повлияет.
Чего нельзя сказать о манипуляциях с RGB-каналами, Джона опять не узнали, хоть и расстояние Хэмминга для такого случая гораздо меньше.
Остальные результаты выглядят так:
Не мешают (расстояние Хэмминга = 0) | Мешают (расстояние Хэмминга — в скобках) |
---|---|
Измененное имя файла | Кроп (34)* |
Формат (JPEG, PNG, GIF) | Поворот 90° (32)** |
Оптимизация Google PageSpeed | Зеркальное отражение (36) |
Ресайз с сохранением пропорций и без | Изменение положения кривых в RGB-каналах (18) |
Изменение цветовой гаммы и четкости |
*зависит от величины кропнутой области. При отрезании от картинки маленькой рамки толщиной в несколько пикселей, расстояние Хэмминга будет нулевым, следовательно сходство — 100%. Но чем ощутимее кроп — тем больше расстояние — тем меньше шансов обнаружить дубликат. О поиске кропнутых дубликатов через перцептивные хеши можно почитать тут.
**то же самое, что и с кропом. При повороте на пару градусов расстояние незначительное, но чем больше угол наклона — тем сильнее различие.
PHP и чтение текста на изображении: начало
Вероятно многим приходилось сталкиваться с расшифровкой текста на изображениях, по совершенно разным причинам.
Совсем недавно мне понадобился такой алгоритм, которым я буду рад с вами поделиться. Данный пример не претендует на универсальность и требует доработки, но в частном случае он выполняет свою задачу.
1. Работа с исходным изображением.
У нас есть изображения фиксированного размера, но с разным текстом.
В моем случае такие:
1.1 Упрощаем изображения
Для этого я безболезненно обесцвечиваю изображение и выкручиваю контрастность. Безусловно, в каждом частном случае, преобразование изображения в удобную для нас форму может затребовать других действий.
Преобразование в моем случае делается так:
После этого я получаю инвертированное двухцветное черно-белое изображение.
1.2 Находим символы на изображении
В моем случае задача простая: все символы находятся всегда на одних и тех же местах. Поэтому немного хардкода:
2. Преобразуем символы в массив
На выходе получаем нечто такое:
01111111110000
00000100000000
00000100000000
00000100000000
00000100000000
00000100000000
00000100000000
00000100000000
00000100000000
00000100000000
00000100000000
00000100000000
00000000000000
3. Распознание символа в массиве
Используем простую однослойную нейронную сеть. Для начала необходимо ее научить.
Для ускорения, можно проводить обучение в несколько итераций.
На самое главное это «покормить» нашу нейросеть всеми символами.
Что бы спросить сеть используем метод:
Пример работы алгоритма:
exif_imagetype
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
exif_imagetype — Determine the type of an image
Описание
exif_imagetype() считывает начальные байты изображения и проверяет их сигнатуру.
Список параметров
filename Изображение, тип которого требуется определить.
Возвращаемые значения
Следующие определённые константы представляют возможные возвращаемые значения функции exif_imagetype() :
Значение | Константа |
---|---|
1 | IMAGETYPE_GIF |
2 | IMAGETYPE_JPEG |
3 | IMAGETYPE_PNG |
4 | IMAGETYPE_SWF |
5 | IMAGETYPE_PSD |
6 | IMAGETYPE_BMP |
7 | IMAGETYPE_TIFF_II (порядок байт intel) |
8 | IMAGETYPE_TIFF_MM (порядок байт motorola) |
9 | IMAGETYPE_JPC |
10 | IMAGETYPE_JP2 |
11 | IMAGETYPE_JPX |
12 | IMAGETYPE_JB2 |
13 | IMAGETYPE_SWC |
14 | IMAGETYPE_IFF |
15 | IMAGETYPE_WBMP |
16 | IMAGETYPE_XBM |
17 | IMAGETYPE_ICO |
18 | IMAGETYPE_WEBP |