Ресайз что это такое


Уменьшение размеров фотографии без потери деталей

Фото, видео и аудио

Каждый, кто когда-нибудь сохранял фотографии для Интернета, замечал такую неприятную мелочь: исходная фотография абсолютно резкая, а как только уменьшаем число пресловутых пикселей раз в десять, вся резкость сразу улетучивается. А ведь вроде бы всё должно быть наоборот – пережатая фотография должна быть полна всяких мелких деталей. Рассмотрим, почему так получается и как с этим бороться.

Казалось бы, если взять десятимегапиксельный пейзаж или портрет с нормальной резкостью и уменьшить его размер, скажем, до мегапикселя, то количество деталей должно сократиться незначительно, а из-за намного более сильного уменьшения числа пикселей относительная детализация должна только возрасти. Но не тут-то было. Как ни странно, изменение размеров изображения – не такая простая задача, как кажется на первый взгляд. И дело вовсе не в сложности реализации какого-либо алгоритма, вовсе нет. Сложность прежде всего в том, что невозможно такой универсальный алгоритм придумать в принципе.

Рассмотрим простейший пример – чёрно-белое изображение шахматной доски размером 8х8 пикселей. Нам необходимо уменьшить размер картинки до 4х4 пикселя. Что мы получим в итоге? В результате такого преобразования у нас будет вместо кучи деталей одна сплошная серая масса, и ничего с этим поделать нельзя. А ведь это лишь простейший случай уменьшения размеров в 2 раза!

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

Самый простой и достаточно качественный способ уменьшить размер картинки – воспользоваться распространённой программой для просмотра изображений ACDSee. Рассмотрим, как можно это сделать в ACDSee 10.0.

Запускаем ACDSee и отрываем в программе нужную фотографию. После этого кликаем правой кнопкой мыши и выбираем в появившемся меню Edit -> Edit Mode (для русифицированной версии: Правка-> Режим редактирования). Перед нами появляется панель для редактирования изображения. Нажимаем на Resize (Изменить размер). Теперь мы меняем размер изображения: можно указать новый размер в пикселях, в процентах от оригинала и в сантиметрах или дюймах. При ресайзе фотографий обязательно убедитесь в том, что выставлен масштаб просмотра 100%, – это позволит контролировать конечный результат. В панели фильтра изменения размера должен быть выставлен алгоритм Lanczos – он показывает наилучшие результаты для большинства фотографий. Конечно, никто не запрещает экспериментировать – можно указать другой алгоритм ресайза, благо в ACDSee их немало.

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

Рассмотрим этот алгоритм.

1) Запускаем Photoshop и открываем фотографию. Открываем вкладку Image -> Mode и отмечаем галочкой Lab Color вместо стандартного RGB.

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

Дело в том, что при представлении фотографии в режиме RGB за каждый пиксель изображения отвечают три числа: одно обозначает яркость красного, другое – яркость синего, третье – яркость зелёного цвета. То есть у нас есть как бы не одно изображение, а целых три. И увеличиваем резкость мы для каждого канала в отдельности – так уж устроен фильтр Unsharp Mask. При повышении резкости в RGB мы влияем не только на резкость, но и на цвет – ведь при увеличении чёткости фактически изменяется красный, синий и зелёный каналы в отдельности, и от этого возникают цветные ореолы.

А вот Lab Color – другое дело. В цветовом пространстве Lab изображение состоит из трёх каналов – два несут в себе информацию о цвете фотографии, а третий содержит информацию о яркости. И поэтому при повышении резкости только в канале яркости Lightness цветные ореолы не появятся.

2) Делаем активным канал Lightness во вкладке Channels. Остальные каналы необходимо сделать видимыми для просмотра результата повышения резкости.

3) Перед повышением резкости изменим размер изображения. Для этого открываем окно Image -> Image Size. В поле Width указываем учетверённое значение той ширины изображения (в пикселях), которую хотим получить в конечном счёте.

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

Итак, что же значит «резкое изображение»? Резкость – это чёткие границы между деталями. То есть если граница контрастная и чётко выражена, то картинка выглядит резкой. Именно на таком оптическом обмане и основано действие фильтра для повышения резкости Unsharp Mask – этот фильтр увеличивает локальный контраст на границе деталей, что выглядит как повышение резкости. И именно из-за увеличения локального контраста при злоупотреблении фильтром у предметов возникают неприятные белые окантовки.

Рассмотрим настройки фильтра Unsharp Mask. У фильтра есть три ползунка: Amount, Radius и Threshold. Amount влияет на силу воздействия фильтра, Radius – на ширину ореола, Threshold задаёт порог для действия фильтра Unsharp Mask. Порогу Threshold стоит уделить особое внимание. При нулевом значении для Threshold фильтр Unsharp Mask может подчёркивать шумы изображения и различные нежелательные детали изображения.

Теперь наконец приступим к обработке фотографии. Первым делом мы дублируем слой при помощи комбинации Ctrl+J. Далее делаем активным канал Lightness во вкладке Channels.

Приступаем к первому повышению резкости. Для этого выбираем Filter -> Sharpen -> Unsharp Mask. Значение Radius должно быть примерно от 0.8. При выставлении параметра Radius обращаем внимание на сюжетно важные детали (для портрета это будут глаза, для пейзажа – листва и камни) – фильтр должен подчёркивать нужные нам элементы. Если же Unsharp Mask не повышает резкость сюжетно важных деталей, это свидетельствует о необходимости увеличить Radius – такие действия даже позволяют слегка исправить промашку автофокуса, так как в некоторой мере при помощи Radius мы влияем на глубину резкости.

Второй важный параметр – Threshold. Его необходимо подобрать так, чтобы Unsharp Mask не подчёркивал шумы. Обычные значения при повышении резкости для Threshold – 6-8.

И третьим мы выставим Amount, влияющий на силу воздействия фильтра Unsharp Mask. Необходимые значения для Amount зависят от конкретных изображений и колеблются в очень широких пределах – то 70 до 180.

Далее уменьшаем фотографию при помощи Image -> Image size. В поле Width задаём 50 процентов и нажимаем OK.

Выбираем Filter -> Sharpen -> Unsharp Mask. Значение Radius должно быть в два раза меньше по сравнению с первичным повышением резкости. При выставлении параметра Radius снова обращаем внимание на сюжетно важные детали – фильтр их должен подчёркивать. Threshold оставляем неизменным, Amount немного уменьшаем. И опять фотографию делаем в 2 раза меньше при помощи Image -> Image size (в поле Width пишем 50 процентов и нажимаем OK).

И теперь – последнее повышение резкости: Filter -> Sharpen -> Unsharp Mask, значение Radius – 0.2 или 0.3, Threshold делаем нулевым, Amount увеличиваем до необходимого значения.

Вот и всё. Остаётся только перевести изображение из Lab в RGB (Image -> Mode -> RGB Color) и сохранить уменьшенную фотографию. В результате применения такого ступенчатого ресайза улучшается контроль над шумами и появляется даже некоторый контроль над глубиной резкости по сравнению с однократным уменьшением фотографии до нужных размеров.

www.ferra.ru

Что такое кроп и рисайз

?

velocyraptor (velocyraptor) wrote, 2011-03-15 11:57:00 velocyraptor velocyraptor 2011-03-15 11:57:00 Category: Новички в фотографии зачастую не знают, как правильно подготовить свои снимки для публикации в интернете и либо выкладывают полноразмерные фотографии, «весящие» несколько мегабайт, либо в погоне за уменьшением объёма сжимают их настолько, что за артефактами JPG-компрессии трудно различить то, что находится на снимке. Получив в ответ от смотрящих эти снимки совет использовать кроп или рисайз, новичок вопрошает: «А что это такое?» Попробуем разобраться в этих терминах поподробнее. 

Узнать больше...

Рисайз (от английского слова resize) - изменение размера. Как и многие технические термины - рисайз (иногда пишут ресайз, что не совсем верно) это жаргонизм. Необходимость его использования вызвана тем, что термин «изменение размера» слишком обтекаемый и имеет несколько различных толкований от изменения линейных размеров изображения до изменения объёма памяти, занимаемой этим изображением. Поэтому в дальнейшем, чтобы не вносить путаницу, рисайзом будет называться изменение линейных размеров изображения. Чаще всего под рисайзом понимают уменьшение линейных размеров изображения, называемое по-английски downsize или русским жаргонизмом даунсайз. Но иногда проводят операцию по увеличению линейных размеров снимка, скажем, для его распечатки на плакате. В этом случае речь идёт об апсайзе (английское upsize).Итак, у нас есть изображение, полученное с помощью цифровой фотокамеры. В настоящее время оно состоит из одного-двух десятков мегапикселей и его линейные размеры, предположим, 4000 на 3000 пикселей. В то же время, подавляющее большинство современных мониторов и телевизоров имеют не более 2000 пикселей по горизонтали. Это значит, что при просмотре этого снимка на мониторе/телевизоре каждая вторая точка изображения будет выброшена, причём способ удаления лишних пикселей зависит от программы, отвечающей за вывод. К сожалению, эти способы не всегда являются оптимальными с точки зрения быстроты и качества (например, выводимое изображение получается несколько размытым). Следовательно, нужно взять операцию рисайза в свои руки. Вторым немаловажным фактором, побуждающим к рисайзу, является пропорциональное уменьшение объёма занимаемых данных, что в свою очередь уменьшает время загрузки изображения. Ведь смотрящим ваши фотографии вовсе не хочется ждать несколько секунд или даже минут чтобы снимок загрузился целиком. К тому же интернет-трафик не всегда бесплатный (особенно у операторов мобильной и спутниковой связи), поэтому почему бы не сэкономить время и деньги ваших зрителей?

Вот тестовая фотография. Её размер 4360×3246 пикселей и она занимает 5,9 Мб (по клику на картинке загрузится оригинал):

Фото 1. Оригинальный снимок, размером 4360×3246 пикселей

Скачивать её полностью - удовольствие не из приятных даже для обладателей быстрого интернета. Сделаем ей рисайз до 1600×1200 пикселей, что можно выполнить в любом графическом редакторе. Фотография стала «весить» 375 Кб.

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

Часто фотографии требуется ещё и кадрирование. Кадрированием или кропом (от английского слова crop)  называется операция по вырезанию части кадра. Скажем, в нашем случае синичка занимает не слишком много места, хотя является основным объектом съёмки. Поэтому лишний фон можно безболезненно отрезать, это можно сделать в любом графическом редакторе с помощью функции Crop (Кадрирование или Обрезка).

Фото 3. Красная рамка показывает область кадрирования

При этом получится изображение размером 2967×2225 пикселей и объёмом 864 Кб:

Фото 4. Откадрированный снимок размером 2967×2225 пикселей

Однако, и оно является достаточно весомым (к тому же не забываем про паранойю), поэтому не мешает сделать нашей картинке рисайз до 1600×1200 пикселей  и объёма 344 Кб.

Фото 5. Откадрированный снимок, уменьшенный до размера 1600×1200 пикселей

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

Фото 6. Объяснение попиксельного кропаНа таком кропе особенно хорошо заметны все недостатки цифровой фотографии - шумы, замыливание, яркостные и цветные ореолы. Впрочем, как и наоборот, попиксельный кроп способен показать приемлемое качество фотоаппарата и оптики.Фото 7. Попиксельный кроп в размере один к одному (то есть одна точка на фотографии отображается на одну точку на экране)  Tags: crop, resize, ЦФК, дневник, изображение, кадрирование, кроп, обработка, понятия, редактирование, редактор, рисайз, статья, текст, термины, фото, фотография

velocyraptor.livejournal.com

Как я сделал самый быстрый ресайз изображений. Часть 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 (правда бывают и другие разновидности Ланцоша).

Эти числа называют окном фильтра, т.к. фильтр применяется только в этом диапазоне, а за его пределами равен нулю. Соответственно ряд исходных пикселей, необходимый для свертки, берется в радиусе размером в окно фильтра помноженном на коэффициент уменьшения (или на единицу, если происходит увеличение). Думаю, это лучше объяснить на примере. Нам нужно уменьшить изображение шириной 2560 пикселей до ширины 2048, используя бикубический фильтр. Допустим, мы хотим найти значение 33-го пикселя конечного изображения. У бикубического фильтра размер окна равен двум, а коэффициент уменьшения получается 2560/2048 = 1,25, поэтому нам нужно будет взять строку пикселей исходного изображения от floor((33 - 2) × 1,25) до ceil((33 + 2) × 1,25). Т.е. с 38-го по 44-й пиксель. Для этих же пикселей высчитываются значения коэффициентов.

До этого момента я говорил о ряде коэффициентов и ряде пикселей, упуская из виду факт, что изображение — это вообще-то двумерная структура. И вроде по логике, сворачивать нужно не линию, а какую-то область исходного изображения. Но одно из свойств свёрток заключается в том, что операцию можно провести отдельно по вертикали и по горизонтали, сделав два прохода. Грубо говоря, это позволяет уменьшить сложность одной свертки с 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 пикселей ресайзится до разрешений 320x200, 2048x1280 и 5478x3424 с использованием билинейного, бикубического и фильтра Ланцоша (т.е. всего 9 операций). Исходное изображение взято достаточно большое, чтобы не поместиться полностью в кеш процессора третьего уровня. При этом фактическое содержимое изображения не имеет значения с точки зрения производительности, можно ресайзить хоть пустой белый лист, хоть черный, хоть фоточку вашего кота. Вот пример результатов библиотеки Pillow версии 2.6, до любых оптимизаций.

Scale 2560×1600 RGB image to 320x200 bil 0.08927 s 45.88 Mpx/s to 320x200 bic 0.13073 s 31.33 Mpx/s to 320x200 lzs 0.16436 s 24.92 Mpx/s to 2048x1280 bil 0.40833 s 10.03 Mpx/s to 2048x1280 bic 0.45507 s 9.00 Mpx/s to 2048x1280 lzs 0.52855 s 7.75 Mpx/s to 5478x3424 bil 1.49024 s 2.75 Mpx/s to 5478x3424 bic 1.84503 s 2.22 Mpx/s to 5478x3424 lzs 2.04901 s 2.00 Mpx/s

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

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

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

Дальше: Часть 1, общие оптимизации

habr.com

Ресайз баннера, изменить размер баннера по разумной цене, качественно и быстро

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

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

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

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

Ресайз баннера – сложная и ответственная процедура.

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

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

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

bannermakers.ru

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

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

Этот человек сидит среди ромашек, чтобы привлечь ваше внимание к статье.

Для наглядного сравнения я буду использовать изображения одинакового разрешения 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)

Аффинные преобразования — общий метод для искажения изображений. Они позволяют за одну операцию повернуть, растянуть и отразить изображение. Поэтому во многих приложениях и библиотеках, реализующих метод аффинных преобразований, функция изменения изображений является просто оберткой, рассчитывающей коэффициенты для преобразования. Принцип действия заключается в том, что для каждой точки конечного изображения берется фиксированный набор точек исходного и интерполируется в соответствии с их взаимным положением и выбранным фильтром. Количество точек тоже зависит от фильтра. Для билинейной интерполяции берется 2x2 исходных пикселя, для бикубической 4x4. Такой метод дает гладкое изображение при увеличении, но при уменьшении результат очень похож на ближайшего соседа. Смотрите сами: теоретически, при бикубическом фильтре и уменьшении в 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 раза, потому что на какой-нибудь один конечный пиксель может приходиться один исходный, а на соседний — четыре (2x2), что приводит к диспропорции на локальном уровне. В то же время алгоритм с округлением очевидно можно использовать в случаях, когда размер исходного изображения кратен размеру конечного, или масштаб уменьшения достаточно мал (версии разрешением 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. Вот как выглядят самые популярные:

Билинейный фильтр (bilinear или triangle в ImageMagick)

Бикубический фильтр (bicubic, catrom в ImageMagick) Фильтр Ланцоша (Lanczos)

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

Теги:

habr.com

Resize

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

Состав Resize

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

В состав крема входят:

  • Кофеин – стимулирует обменные процессы, разглаживает кожу, разогревает и борется с целлюлитом.
  • Мята перечная – улучшает освобождение тканей от лишней жидкости за счет выраженного дренажного эффекта. Снимает воспаления, успокаивает.
  • Масло кокоса – питает, обладает омолаживающим действием, способствует расщеплению жиров.
  • Колеус Форсколии – обладает выраженным жиросжигающим действием, способствует быстрому избавлению от лишних объемов в самых проблемных местах.
  • Масло грейпфрута – стимулирует местные обменные процессы, способствует исчезновению целлюлита, ухаживает за кожей, делает растяжки менее заметными.
  • Гуарана – еще один сильный сжигатель жира. Расщепляет липидные отложения даже в глубоких слоях кожи.
  • Экстракт перца жгучего – богат капсаицином, который обеспечивает выраженный термогенный эффект, быстрое проникновение активных компонентов в подкожные слои и усиление их действия.

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

Показания и противопоказания к применению

Крем Resize рекомендован всем, кто стремится иметь красивое, подтянутое тело и сексуальную фигуру.

Показания к применению, указанные в инструкции:

  • целлюлит;
  • выраженные отеки тканей;
  • жировые отложения в области живота, бедер, ягодиц и других частей тела;
  • растяжки, обвисшая кожа, стрии.

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

Крем Resize также показан для профилактики развития целлюлита и как ухаживающее средство во время похудения на диетах, спорте или БАДАх.

Противопоказания:

  • беременность;
  • аллергия на компоненты;
  • раны и ссадины на коже;
  • новообразования;
  • детский возраст.

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

Инструкция

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

Если нужен максимально быстрый эффект, после нанесения крема тело обматывают пищевой пленкой, время воздействия средства – 20 минут. Такую процедуру проводят 1 раз в день, вечером. В среднем курс похудения с Resize равен 1–2 месяцам.

Resize: цена и где купить

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

Развод или правда

Крем Resize – безопасное средство, имеющее все необходимые сертификаты для продажи на территории СНГ. Это не лекарство, поэтому мгновенное действие от его использования не наступает. Его задача медленно, но верно вести борьбу с жиром за красоту фигуры.

Производитель указывает следующие эффекты от использования средства:

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

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

Отзывы врачей

Ольга Калинина, дерматолог, г. Москва:

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

Кристина, Волынец, диетолог, г. Краснодар:

«Часто рекомендуют пациентам с ожирением кроме диеты и спортивных нагрузок использовать средства для подтяжки кожи. Кожа отвисает и теряет тонус у многих, кто занимается активным похудением. Resize – не узкоспециализированное средство, но, судя по составу, может неплохо помочь как элемент комплекса».

Отрицательные отзывы покупателей

Виктория, 32 года, г. Санкт-Петербург:

«До нашей русской Венеции крем Resize так и не дошел. Заказала месяц назад, данные подтвердила, ждала с нетерпением. Повторный звонок снова ничего не дал; возможно, у них загрузка сильная… Надеюсь, что мне перезвонят или придет уведомление с почты».

Инесса Владимировна, 40 лет, г. Москва:

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

Положительные отзывы покупателей

Мария, 29 лет, г. Сочи: Беременность и роды сильно изменили мою фигуру. Безобразные складки на животе, растяжки на бедрах… Первые полгода кормила малыша, поэтому на себя времени не было, нашла самый простой способ вернуть красоту – купила Resize. После первого использования заметила ровный рельеф кожи, нежность и гладкость. Сантиметры стали уходит к концу первой недели использования. Я довольна.

Ольга, 30 лет, г. Оренбург: Неплохое средство для подтяжки кожи и коррекции фигуры. Явного жира у меня не было, но предпосылки появились. Крем Resize быстро справился с ними, и теперь я радуюсь своей идеальной фигуре.

Маргарита Евгеньевна, 50 лет, г. Орел: Купила Resize больше как хорошее ухаживающее средство для поддержания красоты кожи. Была удивлена эффектом похудения. За 2 недели ушло 2,5 кг. Даже целлюлит на бедрах стал менее заметен, и кожа разгладилась.

  • Diet drink
  • Neo Slim Burn
  • Редуксал
  • Zero Slim
(3 голоса, в среднем: 5 из 5)

pohudet.guru


Смотрите также