Что такое ресайзы в дизайне

Почему важны ресайзы рекламных баннеров в социальных сетях?

Время чтения: 3 минуты Нет времени читать?

В этой статье я хочу рассказать, почему нужно учитывать резайры (изменение размера) изображений в соц. сетях.

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

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

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

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

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

Размеры изображений Вконтакте

Ниже описаны основные форматы рекламы ВКонтакте, работающие с использованием рекламных баннеров.

1. Изображение и текст (формат 145х85 рх, заголовок в 33 символа и описание в 70).

2. Большое изображение (формат 145х165 рх, текст 33 символа).

3. Продвижение сообществ (формат 145х145 рх, название сообщества).

4. Специальный формат продвижения сообществ (256х256 рх, название сообщества)

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

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

Первые три формата, показываются пользователям не в ленте, а с левой стороны пользовательского интерфейса ВКонтакте.

Маленький размер этих форматов несколько ограничивает возможности текстового и графического оформления.

При создании рекламной записи с кнопкой либо при размещении в посте ссылки или лидогенерации и загрузке сниппета

1. Изображение нужно загружать 537х240 рх.

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

Facebook

У Facebook основные форматы изображения два:

Форматы отображается во всех местах размещения рекламы Facebook. На первый взгляд всё просто, но это не так: чтобы баннер в Facebook показывался и охватывал максимум аудитории, недостаточно просто сделать картинку подходящего формата. Максимальный охват рекламы обеспечат только те изображения, которые содержат не более 20% текста.

Instagram

При создании баннеров для Instagram с текстом и общим оформлением такая же ситуация, как и в Facebook, нужно обязательно учитывать сколько текста находится на картинке, также изображение, может содержать не более 20%.

Для объявлений в ленте и кольцевой галерее оптимальный размер изображений – 1080х1080 рх, минимально допустимые формат картинок: квадратная – 600х600 рх. Меньший размер изображения не загрузится. Как обычно изображение можно обрезать, но вы можете потерять часть важной информации.

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

Квадратная форма наиболее приемлема для этой социальной сети. На баннере рекомендуется размещать кнопки с призывом к действию, например, «Узнать больше», «Зарегистрироваться», «Попробовать сейчас». Этот элемент увеличивает кликабельность объявления в Instagram.

Источник

Ликбез: методы ресайза изображений

Почему изображение, масштабированное с бикубической интерполяцией, выглядит не как в Фотошопе. Почему одна программа ресайзит быстро, а другая — нет, хотя результат одинаковый. Какой метод ресайза лучше для увеличения, а какой для уменьшения. Что делают фильтры и чем они отличаются.

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

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Этот человек сидит среди ромашек, чтобы привлечь ваше внимание к статье.

Для наглядного сравнения я буду использовать изображения одинакового разрешения 1920×1280 (одно, второе), которые буду приводить к размерам 330×220, 1067×667 и 4800×3200. Под иллюстрациями будет написано, сколько миллисекунд занял ресайз в то или иное разрешение. Цифры приведены лишь для понимания сложности алгоритма, поэтому конкретное железо или ПО, на котором они получены, не так важно.

Ближайший сосед (Nearest neighbor)

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

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

Вообще, качество и производительность любого метода уменьшения можно оценить по отношению количества пикселей, участвовавших в формировании конечного изображения, к числу пикселей в исходном изображении. Чем больше это отношение, тем скорее всего алгоритм качественнее и медленнее. Отношение, равное одному, означает что как минимум каждый пиксель исходного изображения сделал свой вклад в конечное. Но для продвинутых методов оно может быть и больше одного. Дак вот, если например мы уменьшаем изображение методом ближайшего соседа в 3 раза по каждой стороне, то это соотношение равно 1/9. Т.е. большая часть исходных пикселей никак не учитывается.

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
1920×1280 → 330×220 = 0,12 ms
1920×1280 → 1067×667 = 1,86 ms
1920×1280 → 4800×3200 = 22,5 ms

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

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

Аффинные преобразования (Affine transformations)

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

Принцип действия заключается в том, что для каждой точки конечного изображения берется фиксированный набор точек исходного и интерполируется в соответствии с их взаимным положением и выбранным фильтром. Количество точек тоже зависит от фильтра. Для билинейной интерполяции берется 2×2 исходных пикселя, для бикубической 4×4. Такой метод дает гладкое изображение при увеличении, но при уменьшении результат очень похож на ближайшего соседа. Смотрите сами: теоретически, при бикубическом фильтре и уменьшении в 3 раза отношение обработанных пикселей к исходным равно 4² / 3² = 1,78. На практике результат значительно хуже т.к. в существующих реализациях окно фильтра и функция интерполяции не масштабируются в соответствии с масштабом изображения, и пиксели ближе к краю окна берутся с отрицательными коэффициентами (в соответствии с функцией), т.е. не вносят полезный вклад в конечное изображение. В результате изображение, уменьшенное с бикубическим фильтром, отличается от изображения, уменьшенного с билинейным, только тем, что оно еще более четкое. Ну а для билинейного фильтра и уменьшения в три раза отношение обработанных пикселей к исходным равно 2² / 3² = 0.44, что принципиально не отличается от ближайшего соседа. Фактически, аффинные преобразования нельзя использовать для уменьшения более чем в 2 раза. И даже при уменьшении до двух раз они дают заметные эффекты лесенки для линий.

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

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
1920×1280 → 330×220 = 6.13 ms
1920×1280 → 1067×667 = 17.7 ms
1920×1280 → 4800×3200 = 869 ms

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

Мое скромное мнение, что использование этого способа для произвольного уменьшения изображений попросту является багом, потому что результат получается очень плохой и похож на ближайшего соседа, а ресурсов на этот метод нужно значительно больше. Тем не менее, этот метод нашел широкое применение в программах и библиотеках. Самое удивительное, что этот способ используется во всех браузерах для метода канвы drawImage() (наглядный пример), хотя для простого отображения картинок в элементе используются более аккуратные методы (кроме IE, в нем для обоих случаев используются аффинные преобразования). Помимо этого, такой метод используется в OpenCV, текущей версии питоновской библиотеки Pillow (об этом я надеюсь написать отдельно), в Paint.NET.

Кроме того, именно этот метод используется видеокартами для отрисовки трехмерных сцен. Но разница в том, что видеокарты для каждой текстуры заранее подготавливают набор уменьшенных версий (mip-уровней), и для окончательной отрисовки выбирается уровень с таким разрешением, чтобы уменьшение текстуры было не более двух раз. Кроме этого, для устранения резкого скачка при смене mip-уровня (когда текстурированный объект приближается или отдаляется), используется линейная интерполяция между соседними mip-уровнями (это уже трилинейная фильтрация). Таким образом для отрисовки каждого пикселя трехмерного объекта нужно интерполировать между 2³ пикселями. Это дает приемлемый для быстро движущейся картинки результат за время, линейное относительно конечного разрешения.

Суперсемплинг (Supersampling)

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

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

Можно выделить два подвида этого метода: с округлением границ пикселей до ближайшего целого числа пикселей и без. В первом случае алгоритм становится малопригодным для масштабирования меньше чем в 3 раза, потому что на какой-нибудь один конечный пиксель может приходиться один исходный, а на соседний — четыре (2×2), что приводит к диспропорции на локальном уровне. В то же время алгоритм с округлением очевидно можно использовать в случаях, когда размер исходного изображения кратен размеру конечного, или масштаб уменьшения достаточно мал (версии разрешением 330×220 почти не отличаются). Отношение обработанных пикселей к исходным при округлении границ всегда равно единице.

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
1920×1280 → 330×220 = 7 ms
1920×1280 → 1067×667 = 15 ms
1920×1280 → 4800×3200 = 22,5 ms

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

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
1920×1280 → 330×220 = 19 ms
1920×1280 → 1067×667 = 45 ms
1920×1280 → 4800×3200 = 112 ms

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

Данный метод используется в функции gdImageCopyResampled() библиотеки GD, входящей в состав PHP, есть в OpenCV (флаг INTER_AREA), Intel IPP, AMD Framewave. Примерно по такому же принципу работает libjpeg, когда открывает изображения в уменьшенном в несколько раз виде. Последнее позволяет многим приложениям открывать изображения JPEG заранее уменьшенными в несколько раз без особых накладных расходов (на практике libjpeg открывает уменьшенные изображения даже немного быстрее полноразмерных), а затем применять другие методы для ресайза до точных размеров. Например, если нужно отресайзить JPEG разрешением 1920×1280 в разрешение 330×220, можно открыть оригинальное изображение в разрешении 480×320, а затем уменьшить его до нужных 330×220.

Свертки (Convolution)

Этот метод похож на аффинные преобразования тем, что используются фильтры, но имеет не фиксированное окно, а окно, пропорциональное масштабу. Например, если размер окна фильтра равен 6, а размер изображения уменьшается в 2,5 раза, то в формировании каждого пикселя конечного изображения принимает участие (2,5 * 6)² = 225 пикселей, что гораздо больше, чем в случае суперсемплинга (от 9 до 16). К счастью, свертки можно считать в 2 прохода, сначала в одну сторону, потом в другую, поэтому алгоритмическая сложность расчета каждого пикселя равна не 225, а всего (2,5 * 6) * 2 = 30. Вклад каждого исходного пикселя в конечный как раз определяется фильтром. Отношение обработанных пикселей к исходным целиком определяется размером окна фильтра и равно его квадрату. Т.е. для билинейного фильтра это отношение будет 4, для бикубического 16, для Ланцоша 36. Алгоритм прекрасно работает как для уменьшения, так и для увеличения.

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайнеЧто такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне
1920×1280 → 330×220 = 76 ms
1920×1280 → 1067×667 = 160 ms
1920×1280 → 4800×3200 = 1540 ms

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

Именно этот метод реализован в ImageMagick, GIMP, в текущей версии Pillow с флагом ANTIALIAS.

Одно из преимуществ этого метода в том, что фильтры могут задаваться отдельной функцией, никак не привязанной к реализации метода. При этом функция самого фильтра может быть достаточно сложной без особой потери производительности, потому что коэффициенты для всех пикселей в одном столбце и для всех пикселей в одной строке считаются только один раз. Т.е. сама функция фильтра вызывается только (m + n) * w раз, где m и n — размеры конечного изображения, а w — размер окна фильтра. И наклепать этих функций можно множество, было бы математическое обоснование. В ImageMagick, например, их 15. Вот как выглядят самые популярные:

Примечательно, что некоторые фильтры имеют зоны отрицательных коэффициентов (как например бикубический фильтр или фильтр Ланцоша). Это нужно для придания переходам на конечном изображении резкости, которая была на исходном.

Источник

Как я сделал самый быстрый ресайз изображений. Часть 0

Здравствуйте, меня зовут Саша, я написал самый быстрый ресайз изображений для современных х86 процессоров. Я так утверждаю, поскольку все остальные библиотеки, которые я сумел найти и протестировать, оказались медленнее. Я занялся этой задачей, когда работал над оптимизацией ресайза картинок на лету в Uploadcare. Мы решили открыть код и в результате появился проект Pillow-SIMD. Любой желающий с легкостью может использовать его в приложении на языке Python.

Любой код выполняется на конкретном железе и хорошей оптимизации можно добиться, только понимая его архитектуру. Всего я планирую выпустить 4 или 5 статей, в которых расскажу как применять знание архитектуры железа для оптимизации реальной задачи. Своим примером я хочу побудить вас оптимизировать другие прикладные задачи. Первые две статьи выйдут в течение недели, остальные — по мере готовности.

О задаче

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

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

… с помощью ресемплинга методом сверток. Что?

Чтобы было понятно, что конкретно нуждалось в оптимизации, я расскажу, что такое ресемплинг свертками. Свертка (правильно говорить свертка дискретных значений, т.к. пиксели изображения дискретны) — это очень простая математическая операция. У нас есть какой-то ряд значений №1 (коэффициенты) и ряд значений №2 (данные, в нашем случае интенсивность каналов пикселей). Результат свертки этих двух рядов будет сумма произведений всех членов попарно. Вот так просто — сумма произведений. Матан закончился, не успев начаться.

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

Осталось понять, как именно эта операция связана с ресайзом. Ряд значений №2 — это ряд пикселей исходного изображения. Ряд значений №1 — это коэффициенты, получающиеся из фильтра. Фильтр — это такая функция, которая определяет, как именно мы будем сворачивать значения. Может быть вы замечали в окошке ресайза в Фотошопе или другом графическом редакторе выпадающее меню с фильтрами — билинейный, бикубический, иногда Ланцош. Это и есть этот фильтр. А вот получившееся в результате свертки значение — это интенсивность одного канала одного пикселя конечного изображения. Т.е. чтобы получить изображение размером M×N пикселей, нам нужно сделать M×N×C операций свертки, где С — количество цветовых каналов. Да, посчитать весь пиксель одной операцией не получится, значения разных каналов независимы и должны считаться отдельно.

Функции фильтров не бесконечны, их значения не равны нулю лишь в центральной части: для билинейного фильтра это диапазон значений от –1 до 1; для бикубического от –2 до 2, для Ланцоша от –3 до 3 (правда бывают и другие разновидности Ланцоша).

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

До этого момента я говорил о ряде коэффициентов и ряде пикселей, упуская из виду факт, что изображение — это вообще-то двумерная структура. И вроде по логике, сворачивать нужно не линию, а какую-то область исходного изображения. Но одно из свойств свёрток заключается в том, что операцию можно провести отдельно по вертикали и по горизонтали, сделав два прохода. Грубо говоря, это позволяет уменьшить сложность одной свертки с O(n²) до O(2n) (на самом деле меньше, но все равно существенно).

Почему все же свертки

Вообще, фраза «ресайз изображения» несет в себе минимум информации о том, что нужно сделать. Она говорит, что мы должны получить изображение конечного размера, используя оригинальное, с сохранением геометрии изображенных объектов. Но использовать исходное изображение можно по-разному. Можно например для каждого конечного пикселя поставить в соответствие один пиксель из исходного и взять его без изменений. Это называется метод ближайшего соседа. Картинка получается грубой, рваной, неприятной:

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

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

А вот как выглядит ресемплинг с помощью сверток:

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

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

Pillow

Pillow — это библиотека для работы с изображениями на языке Python, развиваемая сообществом во главе с Alex Clark и Eric Soroos. В Uploadcare Pillow использовался еще до того, как я пришёл в команду. Тогда мне это показалось странным — работа с изображениями была одной из основных задач, зачем было брать для нее библиотеку, завязанную на язык. Не лучше ли взять тот же ImageMagick, у которого тонна функций, которым пользуются миллион разработчиков, уж в нем наверняка все должно быть хорошо с производительностью. По прошествии нескольких лет, могу сказать, что это была удача как для меня, так и для Pillow. Как выяснилось, производительность обеих библиотек на старте была примерно одинаковой, но я очень сомневаюсь, что у меня хватило бы сил сделать для ImageMagick что-то такое, что я сделал для Pillow.

Pillow — это форк очень старой библиотеки PIL. Исторически, для ресайза в PIL не использовались свёртки. Первая реализация ресайза на свёртках в PIL появилась в версии 1.1.3 и была доступна при использовании фильтра ANTIALIAS, название которого подчеркивало то, что остальные фильтры использовали менее качественные алгоритмы. В сети до сих пор можно часто встретить уже не актуальные рекомендации использовать при ресайзе в PIL (и в Pillow, как приемнике) только фильтр ANTIALIAS.

К сожалению, у ANTIALIAS была довольно низкая производительность. Я полез в исходный код, чтобы посмотреть, что можно сделать, и оказалось, что реализация ресайза для ANTIALIAS (то есть свертки), может быть использована и с остальными фильтрами. А сама константа ANTIALIAS соответствует фильтру Ланцоша, у которого большое окно (±3), и поэтому он достаточно медленный. Самая первая оптимизация, которую я хотел сделать — включить свёртки для билинейного и бикубического фильтров. Так стало бы возможным у себя в приложении использовать более дешёвый бикубический фильтр (с окном ±2) и не слишком потерять в качестве.

Дальше мне было интересно посмотреть на код самого ресайза. Я без труда нашёл его в этом модуле. И хоть я и пишу в основном на питоне, я сразу заметил несколько сомнительных мест с точки зрения производительности. После нескольких оптимизация я получил прирост в 2,5 раза (это будет описано в следующей статье). Потом я стал экспериментировать с SIMD, переводить все вычисления на целые числа, агрессивно разворачивать циклы и группировать вычисления. Задача была чрезвычайно интересной, в голове всегда были еще пара идей, как улучшить производительность. Я погружался в кроличью нору все глубже и глубже, периодически проверяя очередную гипотезу.

Постепенно код становился все больше, а скорость все выше. Часть наработок отдавалась обратно в Pillow. Но SIMD-код было трудно перенести, потому что он написан для конкретной архитектуры, а Pillow — кроссплатформенная библиотека. Поэтому было решено сделать не кроссплатформенный форк Pillow-SIMD. Версии Pillow-SIMD полностью соответствуют версиям оригинальной Pillow и добавляют ускорение некоторых операций.

В последних версиях Pillow-SIMD с AVX2 ресайз работает от 15 до 30 раз быстрее, чем в первоначальном PIL. Как я уже говорил в самом начале, это самая быстрая реализация качественного ресайза, которую мне удавалось протестировать. Можно посмотреть страничку, на которой собраны результаты бенчмарков разных библиотек.

Что такое ресайзы в дизайне. Смотреть фото Что такое ресайзы в дизайне. Смотреть картинку Что такое ресайзы в дизайне. Картинка про Что такое ресайзы в дизайне. Фото Что такое ресайзы в дизайне

Что меня радует в случае с Pillow и Pillow-SIMD, это то, что это реальные библиотеки, которые реально использовать даже начинающему разработчику. Это не кусок кода, опубликованный на Stack Overflow, который непонятно куда воткнуть. И не «примитивные блоки», из которых как из конструктора нужно собирать каждую операцию. И даже не сложная C++ библиотека с запутанным интерфейсом, которая компилируется полчаса. Это одна строчка установки, одна строчка импорта библиотеки, одна строчка загрузки изображения и, «эй, мам, смотри, я пользуюсь самым быстрым ресайзом в своем приложении».

Замеры производительности

В статьях я буду выкладывать замеры производительности в виде таблицы, в которой исходное изображение разрешением 2560×1600 пикселей ресайзится до разрешений 320×200, 2048×1280 и 5478×3424 с использованием билинейного, бикубического и фильтра Ланцоша (т.е. всего 9 операций). Исходное изображение взято достаточно большое, чтобы не поместиться полностью в кеш процессора третьего уровня. При этом фактическое содержимое изображения не имеет значения с точки зрения производительности, можно ресайзить хоть пустой белый лист, хоть черный, хоть фоточку вашего кота. Вот пример результатов библиотеки Pillow версии 2.6, до любых оптимизаций.

Второй столбец здесь это время в секундах, а третий — пропускная способность исходного изображения для данной операции. То есть, если операция заняла 0,2 с, то пропускная способность будет 2560×1600/0,2 = 20,48 мегапикселей в секунду.

Исходное изображение ресайзится до разрешения 320×200 за 164 миллисекунды. Ну что, вроде неплохо. Может быть вообще не нужно оптимизировать, оставить как есть? Ну, если вспомнить, что разрешение фоток с мобильных телефонов сейчас в среднем имеет размер 12 мегапикселей, то все получается не так радужно. Фотка с айфона будет уменьшаться полсекунды без учета распаковки. Учитывая другие операции, в минуту вы можете обработать ≈80 картинок, а в час — около 5000. Текущая нагрузка на наш сервис около 130 тысяч запросов в час. Нам бы понадобилось 26 AWS c4.large серверов, работающих на пределе, чтобы справиться с такой нагрузкой. В реальности же у нас задействовано всего 4 сервера, нагрузка на которые в горячие часы около 40%.

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

Источник

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *