Во многих веб-приложениях существует необходимость автоматического кропа — будь то вырезание аватарки из загруженного фото, превью крупных изображений или создание миниатюр в больших галереях.
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/01b/7d0/889/01b7d0889bca6a508fbaaf001fc7ee27.jpg)
Но машины все еще не люди, и далеко не всегда будет вырезана нужная область. Старые способы типа вырезать миниатюру 100х100 из левого верхнего угла или из центра отходят на второй план, и на арену выходит смарт-кроп.
Большинство библиотек для избежания искажения и растягивания фоток используют смарт-кроп. Суть в том, что сначала код ресайзит картинку так, чтобы один из параметров — длина или ширина — соответствовали заданному. Затем проверяет, соответствует ли второй параметр заданному. Если нет, выполняется кроп лишних областей начиная от центра.
Создание миниатюры, допустим, 400х400 будет происходить так:
Загвоздка в том, что далеко не всегда (а точнее почти никогда) самое главное оказывается в самом центре. Чаще всего — какая-то часть главного, но объекты чаще всего так или иначе смещены.
Общая идея — найти фрагмент картинки, несущий наибольшее количество информации и сохранить его в кропнутой версии.
Сначала картинка ресайзится.
Затем запускается фильтр для определения границ. Картинка становится черно-белой и на ней остаются только контуры обьектов.
Максимально снижается насыщенность и картинка несколько “замыливается”.
Определяется фрагмент с наивысшей энтропией — то есть с наибольшим количеством контуров. Возвращаются координаты этого фрагмента, то есть той части картинки, которую обрезать нельзя ни в коем случае.
![](https://habrastorage.org/r/w780q1/getpro/habr/post_images/6f1/ede/11b/6f1ede11b80ca18be86485470ea70a1f.jpg)
Самый сложный этап — поиск фрагмента с наивысшей энтропией. Поиск выполняется фрагментарно — картинка “разрезается” на 25 полосок, подсчитывается энтропия для каждой из них и сравнивается. Затем определяется группа с максимальной энтропией.
Для применения удобно использовать вот эту библиотеку.
Требования: PHP 5.3 с расширением Imagick. Применяется в три этапа.
Инициализация:
Ресайз и кроп:
Cохранение нового изображения:
Попробовать кроп на основе энтропии можно тут, задав требуемый размер миниатюры.
Иногда алгоритм безошибочно определяет самую важную область. Но иногда и ошибается, особенно при нестандартных — неквадратных параметрах кропа (300х100). Но вот очень хороший результат с теми же параметрами, но другой фоткой. Идеального результата алгоритм не гарантирует, но тем не менее является одним из лучших способов автокропа.
![](https://habrastorage.org/getpro/habr/post_images/01b/7d0/889/01b7d0889bca6a508fbaaf001fc7ee27.jpg)
Но машины все еще не люди, и далеко не всегда будет вырезана нужная область. Старые способы типа вырезать миниатюру 100х100 из левого верхнего угла или из центра отходят на второй план, и на арену выходит смарт-кроп.
Традиционный смарт-кроп
Большинство библиотек для избежания искажения и растягивания фоток используют смарт-кроп. Суть в том, что сначала код ресайзит картинку так, чтобы один из параметров — длина или ширина — соответствовали заданному. Затем проверяет, соответствует ли второй параметр заданному. Если нет, выполняется кроп лишних областей начиная от центра.
Создание миниатюры, допустим, 400х400 будет происходить так:
![](https://habrastorage.org/getpro/habr/post_images/424/da2/51f/424da251f81ddca07e5d03266e878806.jpg)
Загвоздка в том, что далеко не всегда (а точнее почти никогда) самое главное оказывается в самом центре. Чаще всего — какая-то часть главного, но объекты чаще всего так или иначе смещены.
Смарт-кроп на основе энтропии
Общая идея — найти фрагмент картинки, несущий наибольшее количество информации и сохранить его в кропнутой версии.
Как это работает
Сначала картинка ресайзится.
![](https://habrastorage.org/getpro/habr/post_images/2bb/2ac/c6e/2bb2acc6e9f7422e70599eda4bcae8f3.jpg)
Затем запускается фильтр для определения границ. Картинка становится черно-белой и на ней остаются только контуры обьектов.
![](https://habrastorage.org/getpro/habr/post_images/490/639/69e/49063969e77804f593c10e03b97fa71e.jpg)
Максимально снижается насыщенность и картинка несколько “замыливается”.
![](https://habrastorage.org/getpro/habr/post_images/c2b/9de/c96/c2b9dec96c93150972dd84e1aee60a2b.jpg)
Определяется фрагмент с наивысшей энтропией — то есть с наибольшим количеством контуров. Возвращаются координаты этого фрагмента, то есть той части картинки, которую обрезать нельзя ни в коем случае.
![](https://habrastorage.org/getpro/habr/post_images/6f1/ede/11b/6f1ede11b80ca18be86485470ea70a1f.jpg)
Самый сложный этап — поиск фрагмента с наивысшей энтропией. Поиск выполняется фрагментарно — картинка “разрезается” на 25 полосок, подсчитывается энтропия для каждой из них и сравнивается. Затем определяется группа с максимальной энтропией.
Применение
Для применения удобно использовать вот эту библиотеку.
Требования: PHP 5.3 с расширением Imagick. Применяется в три этапа.
Инициализация:
$center = new CropEntropy($imagePath);
Ресайз и кроп:
$croppedImage = $center->resizeAndCrop($width, $height);
Cохранение нового изображения:
$croppedImage->writeimage($newImagePath);
Попробовать кроп на основе энтропии можно тут, задав требуемый размер миниатюры.
Иногда алгоритм безошибочно определяет самую важную область. Но иногда и ошибается, особенно при нестандартных — неквадратных параметрах кропа (300х100). Но вот очень хороший результат с теми же параметрами, но другой фоткой. Идеального результата алгоритм не гарантирует, но тем не менее является одним из лучших способов автокропа.
Конспект
- Один из лучших способов автоматизации кропа — кроп на основе энтропии.
- Алгоритм определяет фрагмент с наибольшим количеством информации и сохраняет его в кропнутой версии.
- Преимущества и недостатки способа можно проверить этим инструментом.