Простой способ оптимизации изображений для публикации в интернете. Оптимизация изображений как важная составляющая CRO-процесса


От автора: каждый разработчик знает, что в вопросе веб-производительности и пользовательского опыта важно каждое изображение. Изображения – это низко висящие плоды оптимизации производительности. Сжатие без визуальной потери качества может принести пользу организациям путем снижения веса страниц без ущерба для работы пользователя, что повышает производительность и привлекает все больше аудитории. Существует множество техник, для определения того, какое изображение необходимо загрузить, но эти «правильные изображения» еще необходимо создать. Целью веб-разработчиков и сервисов по повышению производительности должно быть обеспечение всех пользователей на всех типах устройств и во всех браузерах оптимальными изображениями. (Другой целью должна быть доступность, но это тема для отдельной статьи!).

Определение нужных изображений

Существует несколько front-end методов для обслуживания правильных изображений, среди которых можно выделить медиа запросы для фоновых изображений и теги и с атрибутом srcset для изображений переднего плана.

С помощью @media запросов можно задать, какое фоновое изображение использовать под определенное разрешение экрана и плотность экрана. Например, на старый лэптоп можно посылать изображение lowers.jpg, а на iPad Pro – hires.jpeg:

header { background-image: url(img/hires_header.jpg); } @media only screen and (min-device-pixel-ratio: 2) and (min-width: 1024px) { header { background-image: url(img/hires_header.jpg); } }

header {

@ media only screen and (min - device - pixel - ratio : 2 ) and (min - width : 1024px ) {

header {

background - image : url (img / hires_header . jpg ) ;

А что с изображениями переднего плана?

Техника клоунской машины 2013 года работала на том, что SVG в медиа запросах использовал в качестве размеров окна ширину и высоту контейнера, а не браузера. К счастью, текущая поддержка в браузерах тега picture и атрибута srcset позволяет забыть про этот трюк и picturefill полифил.

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

Работа с picture, source и атрибутом srcset похожа на медиа запросы. Вы указываете, какое изображение переднего плана необходимо использовать под определенный размер окна и плотность экрана:

< picture >

< source srcset = "small_lowres.jpg, small_highres.jpg 2x" media = "(max-width: 768px)" >

< source srcset = "default.jpg, default_highres.jpg 2x" >

< source srcset = "large_lowres.jpg, large_highres.jpg 2x" media = "(min-width: 1024px)" >

< img src = "default.jpg" alt = "image descriptor" >

< / picture >

Обратите внимание: всегда вставляйте стандартный тег img в picture, в том числе и атрибут alt с описанием изображения.

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

< img src = "default.jpg"

srcset = "large.jpg 1024w,

Medium.jpg 768w,

Default.jpg 420w"

sizes = "(min-width: 1024px) 1024px,

(min-width: 768px) 90vw,

100vw"

alt = "image descriptor" / >

При помощи атрибута type можно загружать изображения разных форматов:

< picture >

< source srcset = "photo.jxr" type = "image/vnd.ms-photo" >

< source srcset = "photo.jp2" type = "image/jp2" >

< source srcset = "photo.webp" type = "image/webp" >

< img srcset = "photo.jpg" alt = "My beautiful face" >

< / picture >

Если код сверху для вас что-то новенькое, то JPEG-XR и старыйMIME-тип image/vnd.ms-photo используются для Windows Media Photo, проприетарного формата изображений Microsoft. Поддерживается в IE8+ и Microsoft Edge. JPEG 2000 – это jp2, будет отображаться в браузерах Safari при использовании разметки выше. WebP – формат изображений со сжатием без потери качества, работает в Opera и Chrome. Firefox выберет формат по умолчанию, PNG-A, SVG, GIF или JPEG.

В Firefox и IE8 необходимо прописывать JPEG или PNG фолбек. Firefox и Safari экспериментируют с поддержкой изображений формата WebP, однако по данным сайта CanIUse.com нет никаких намеков на ближайшую поддержку.

Если хотите разобраться в этих новых, но хорошо поддерживаемых функциях, а также научиться применять их, то по медиа запросам, picture и srcset есть несколько замечательных уроков.

Почти безграничная настройка

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

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

Если DOM записывается в браузер исключительно через клиентский JS, как бывает в большинстве React приложений, браузеру можно послать запрос на одно правильное изображение, однако пока код парсится, пользователь может наблюдать частично загруженный неинтерактивный экран (скриншот). В более общем сценарии, когда на сайте есть серверная часть, переписывать запрос на изображение в JS – неоптимальный вариант: браузер сначала загрузит оригинал при парсинге DOM, затем загрузит второе, уже оптимизированное изображение после обновления DOM.

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

К сожалению, спецификация Client Hints, добавляющая информацию о соотношении пикселей на устройстве и ширине окна в поля заголовков HTTP запросов, реализована только в Blink браузерах (Chrome и Opera). Если знать браузер пользователя, разрешение и размер окна, обновление всех запросов на изображения можно автоматизировать, тем самым используя технику прогрессивного улучшения для серверных запросов. При помощи Client Hints можно подтвердить поддержку формата webP (Chrome и Opera поддерживают и клиентские подсказки и webP), разрешения и размера окна. На сайте Instart Logic есть скрипт Nanovisor, делающий то же самое для Client Hints. С его помощью можно посылать оптимизированные изображения в оптимизированных форматах, даже когда Client Hints не поддерживаются.

Техники по определению браузера не так умны, поэтому можно брать строку браузера из HTTP заголовков и таблицу поиска и с их помощью определять возвращаемый медиа тип на основе этих заголовков. Можно переписывать расширения изображения, а можно на каждый вызов изображения возвращать «правильный» тип изображения для всех браузеров, но с «неправильным» расширением. Например, если запрошено изображение foo.jpg, верните лучший медиа тип для браузера, но вызывайте foo.jpg, медиа тип не важен. На сайте Instart Logic мы возвращаем формат webP для бразуеров Chrome и Opera, JPEG-XR для Edge и т.д…. мы не переписываем путь к изображению. Мы просто используем расширение оригинала в имени файла, у нас это jpg. Мы пользуемся тем, что браузеры отрисовывают изображения тех медиа типов, которые они распознают, и не смотрят на расширения (или их отсутствие) в имени файла. В таком случае можно не менять разметку и DOM в JS, а также загружать всего одно изображение на один запрос.

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

Автоматизация процесса по созданию файлов

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

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

Оптимизация изображений может занять много времени на нестатических сайтах, где изображений могут быть тысячи, десятки тысяч и даже миллионы, все разных размеров, разрешений и медиа типов. В программе ImageMagick можно конвертировать изображения в PNG, JPEG, JPEG-2000, GIF, WebP и почти любой формат через командную строку:

В масштабе всего интернета для определения наилучшего качества для всех изображений нужна целая армия людей. Большинство конвертеров и сервисов снижают размер файла за счет снижения качества изображений по одному и тому же коэффициенту или уровню сжатия. К примеру, когда на моих сайтах было мало изображений, я мог вручную сжимать их. Качество менялось от низкого 35% до высокого 88%. Для галерей и других проектов с множеством изображений я использовал Adobe Fireworks для автоматизации сжатия и экспорта, сохраняя все в JPEG с качеством 78%. Как и я, большая часть инструментов по автоматизации сжатия используют одни и те же настройки качества, обычно это около 80%. Я выбрал 78% чисто случайно (немного основываясь на опыте). Волшебного значения качества, которое подойдет под все изображения, нет. Не существует магического уровня сжатия, который сжимает без потерь качества все изображения.

«Правильная» степень сжатия зависит от контента и того, как будет использоваться изображение. Уровень качества экспорта обычно зависит от деталей на изображении. В зависимости от контента подбирается разный уровень для каждого изображения. Зачастую чем больше деталей в изображении, тем ниже качество: пейзаж требует высокого качества под 90, а изображение с множеством деталей будет хорошо смотреться и на уровне ниже 50.

Автоматизировать настройку качества под каждое изображение все-таки можно. Сайт Instart Logic использует computer vision, машинное обучение и конвертер для оптимизации изображений с учетом содержимого, автоматизации процесса создания изображений, оптимизированных под разрешение устройства, браузер и сеть, а также для вычисления оптимального коэффициента сжатия без ущерба для работы пользователя. SmartVision – это алгоритмический подход, использующий машинное обучение для автоматизации адаптивных настроек под каждое изображение, сжимая изображение на максимум без потери качества (исключение составляют только первые несколько изображений, на которых происходит калибровка алгоритма машинного обучения). Продвинутые алгоритмы компьютерного зрения «заглядывают» в контент изображения и максимизируют уровень сжатия без ущерба для работы пользователя на уровне интеллекта. Парвиз Ахаммад объяснил свои алгоритмы для SmartVision намного лучше меня еще в 2014.

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

Ilya is a Developer Advocate and Web Perf Guru

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

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

Удаление и замена изображений

TL;DR

  • Удалите ненужные изображения.
  • При возможности применяйте эффекты CSS3.
  • Используйте веб-шрифты вместо кодировки текста в изображениях.

Прежде всего задайте себе вопрос: действительно ли это изображение необходимо? Хороший дизайн должен быть простым и не ухудшать производительность. Лучше всего просто удалить ненужное изображение, поскольку оно весит гораздо больше байтов по сравнению с HTML, CSS, JavaScript и другими ресурсами на странице. При этом одно изображение в нужном месте может заменить длинный текст, поэтому вам нужно самостоятельно найти баланс и принять правильное решение.

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

  • Благодаря CSS-эффектам (градиентам, теням и т. д.) и CSS-анимации вы можете создать ресурсы, которые четко выглядят при любом разрешении и масштабе и весят гораздо меньше, чем изображения.
  • Веб-шрифты позволяют использовать красивые надписи, сохраняя возможность выбирать и искать текст, а также менять его размер. Благодаря этому работа с вашим ресурсом станет ещё удобнее.

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

Векторные и растровые изображения

TL;DR

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

Если вы решили, что для достижения результата вам следует использовать именно изображение, выберите для него подходящий формат:

Векторное изображение

Растровое изображение

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

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

Однако векторные форматы не подходят для сложных изображений (например, для фотографий). SVG-разметки для описания всех фигур может стать слишком много, но полученное изображение все равно будет выглядеть нереалистично. В этом случае вам стоит использовать растровый формат изображений, например GIF, PNG, JPEG или новые форматы JPEG-XR и WebP.

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

Оптимизация для экранов с высоким разрешением

TL;DR

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

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

Конечно, на экранах с высоким DPI (HiDPI) графика выглядит очень красиво. Однако, чтобы хорошо смотреться в высоком разрешении, наши изображения должны быть более детализированными. Но у нас есть решение: векторные форматы идеально подходят для этой задачи. Они сохраняют четкость в любом разрешении. Даже если увеличатся затраты на отрисовку мелких деталей, мы по-прежнему используем один независимый от размера экрана ресурс.

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

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

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

Оптимизация векторных изображений

TL;DR

  • SVG - это формат изображений на основе XML
  • SVG-файлы нужно минифицировать для уменьшения размера.
  • Сжимайте SVG-файлы с помощью GZIP.

Все современные браузеры поддерживают формат SVG (Scalable Vector Graphics). Это формат изображений на основе XML для двухмерной графики. Разметку SVG можно встроить прямо в страницу или на внешний ресурс. В свою очередь, файл SVG можно создать с помощью любого ПО для векторного рисования или вручную в текстовом редакторе.

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

Например, svgo уменьшает размер приведенного выше файла SVG на 58% с 470 до 199 Б. Кроме того, поскольку SVG - это формат на основе XML, мы может применить сжатие GZIP для уменьшения его размера при передаче. Убедитесь, что на вашем сервере настроено сжатие SVG-ресурсов.

Оптимизация растровых изображений

TL;DR

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

Растровое изображение - это просто двухмерная сетка отдельных пикселей. Например, изображение 100x100 пикселей - это последовательно из 10 000 пикселей. В каждом из пикселей содержатся значения RGBA: красного (R), зеленого (G) и синего (B) канала, а также альфа-канала, или канала прозрачности (A).

Браузер устанавливает 256 значений (оттенков) для каждого канала, которые в пере счете занимают 8 битов на канал (2 ^ 8 = 256) и 4 байта на пиксель (4 канала x 8 бит = 32 бита = 4 байта). Таким образом, зная размеры сетки, мы легко можем вычислить размер файла:

  • Изображение 100 x 100 пикс. состоит из 10 000 пикселей
  • 10 000 пикс. x 4 Б = 40 000 Б
  • 40 000 Б / 1024 = 39 КБ
Note: Кроме того, вне зависимости от формата изображения, передаваемого от сервера клиенту, при расшифровке изображения каждый пиксель занимает 4 байта памяти. Поэтому при отображении больших файлов на устройствах с ограниченным количеством памяти могут возникнуть проблемы.

Может показаться, что 39 КБ - это совсем немного для изображения размером 100x100 пикселей. Однако при увеличении размера файл будет весить гораздо больше, и на его скачивание придется потратить много времени и ресурсов. Сейчас это изображение не сжато. Что можно сделать, чтобы уменьшить его размер?

Один из простых способов оптимизации изображения - снизить глубину цвета с 8 битов на канал, выбрав палитру меньшего размера. Установив глубину в 8 битов на канал, мы получаем 256 значений для канала и 16 777 216 (2563) цветов. Может, стоит уменьшить палитру до 256 цветов? Тогда нам будет нужно всего 8 бит для всех каналов RGB и только 2 байта на пиксель, а не 4, как раньше. Нам удалось сжать изображения в два раза!

Note: Изображения в формате PNG слева направо: 32 бита (16M цветов), 7 бит (128 цветов), 5 бит (32 цвета). Сложные изображения с плавными перехода цвета (градиентами, небом и т. д.) требуют палитр большего размера. Однако если ресурс состоит из небольшого количества цветов, большая палитра - это напрасная трата битов.

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

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

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

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

Сжатие данных с потерями и без потерь

TL;DR

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

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

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

  1. Сжатие изображения [с потерями](http://ru.wikipedia.org/wiki/Сжатие_данных_с_потерями) , при котором удаляются некоторые данные пикселей.
  2. Сжатие изображения [без потерь](http://en.wikipedia.org/wiki/Lossless_compression) , при котором данные пикселей сжимаются.

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

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

При использовании сжатия с потерями, например JPEG, вы сможете выбрать настройки качества (вроде ползунка Сохранить для Web в Adobe Photoshop). Обычно это значение от 1 до 100, которое определяет применение алгоритмов сжатия с потерями и без. Не бойтесь снижать качество: часто изображение по-прежнему хорошо выглядит, а размер файла становится значительно меньше.

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

Выбор формата изображения

TL;DR

  • Выберите подходящий стандартный формат: GIF, PNG или JPEG.
  • Попробуйте установить разные настройки для каждого формата (качество, размер палитры и т. д.) и выберите наиболее подходящие.
  • Для современных клиентов добавьте ресурсы в форматах WebP и JPEG XR масштабированные изображения:
  • Масштабирование изображений - один из самых простых и эффективных методов оптимизации.
  • Если вы используете изображения большого размера, пользователь может скачивать лишние данные.
  • Reduce the number of unnecessary pixels by scaling your images to their display size Снизьте количество ненужных пикселей, уменьшив изображение до отображаемого размера.

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

Формат Прозрачность Анимация Браузер
GIF Да Да Все
PNG Да Нет Все
JPEG Нет Нет Все
JPEG XR Да Да IE
WebP Да Да Chrome, Opera, Android

Существуют три стандартных формата изображений: GIF, PNG и JPEG. Кроме них некоторые браузеры поддерживают новые форматы WebP и JPEG XR, для которых доступно большее сжатие и дополнительные возможности. Итак, какой формат выбрать?

  1. Изображение должно быть анимированным? Тогда выбирайте формат GIF.
  2. Цветовая палитра GIF состоит всего из 256 цветов. Это недостаточно для большинства изображений. Кроме того, формат PNG-8 лучше сжимает изображения с маленькой палитрой. Таким образом, выбирайте GIF, только если вам требуется анимация.
  3. Нужно сохранить все мелкие детали в самом высоком разрешении? Используйте PNG.
  4. В формате PNG не применяется сжатие с потерей данных, не считая выбора размера палитры. Благодаря этому изображение сохраняется в самом высоком качестве, но весит гораздо больше, чем файлы других форматов. Используйте этот формат только там, где это необходимо.
  5. Если изображение состоит из геометрических фигур, конвертируйте его в векторный (SVG-) формат!
  6. Избегайте текста в изображениях. Его нельзя выбрать, найти или увеличить. Если текст необходим для создания дизайна, используйте веб-шрифты.
  7. Вы оптимизируете фотографию, скриншот или изображение похожего типа? Используйте JPEG.
  8. В JPEG используется комбинация сжатия с потерями и без потерь для уменьшения размера файла. Чтобы выбрать лучшее сочетание качества и размера изображения, попробуйте установить несколько уровней качества JPEG.

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

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

  • Некоторые сети доставки контента предоставляют услуги по оптимизации изображений, в том числе предоставление файлов в JPEG XR и WebP.
  • Некоторые инструменты с открытым кодом, например PageSpeed для Apache и Nginx, автоматически производят оптимизацию, преобразование и доставку соответствующих ресурсов.
  • Вы можете добавить дополнительную логику приложения, чтобы определить клиент и его поддерживаемые форматы, а затем отправить оптимальный вариант ресурса.

Обратите внимание, что если вы используете Webview для отрисовки контента в нативное приложении, тогда вы можете полностью управлять клиентом и использовать только WebP. В приложениях Facebook, Google+ и т. д. используются именно WebP-ресурсы, так как они действительно повышают производительность. Чтобы узнать больше об этом формате, посмотрите презентацию WebP: Deploying Faster, Smaller, and More Beautiful Images от Google I/O 2013.

Инструменты и выбор параметров

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

Инструмент Описание
gifsicle создает и оптимизирует GIF-изображения
jpegtran оптимизирует JPEG-изображения
сжимает PNG без потерь
pngquant сжимает PNG с потерями

Не бойтесь экспериментировать с параметрами компрессоров. Установите разные настройки качества, выберите подходящий вариант и примените его к другим похожим изображениям на сайте. Но помните: не все графические ресурсы нужно сжимать одним и тем же методом!

Масштабирование передаваемых изображений

TL;DR

Warning: A tag here did NOT convert properly, please fix! ""

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

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

Note: Чтобы узнать исходный и отображаемый размеры изображения, наведите на него курсор в Инструментах разработчика Chrome. В примере выше мы скачиваем изображение размером 300x260 пикселей, однако при показе клиент уменьшает его до 245x212 пикселей.

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

Исходный размер Отображаемый размер Ненужные пиксели
110 x 110 100 x 100 110 x 110 - 100 x 100 = 2100
410 x 410 400 x 400 410 x 410 - 400 x 400 = 8100
810 x 810 800 x 800 810 x 810 - 800 x 800 = 16100

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

Список методов оптимизации

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

Помните о некоторых советах и техниках, которые помогут вам оптимизировать изображения:

  • Выбирайте изображения в векторных форматах. Их качество не зависит от разрешения и масштаба, поэтому они подходят для больших экранов и разных типов устройств.
  • Минифицируйте и сжимайте SVG-ресурсы. Многие графические приложения добавляют XML-разметку, которая часто содержит ненужные метаданные. Ее можно удалить. Убедитесь, что на серверах настроено GZIP-сжатие для SVG-ресурсов.
  • Выбирайте наиболее подходящие растровые форматы. Определите необходимые требования к изображениям и выберите нужный формат для каждого ресурса.
  • Пробуйте разные настройки качеств для растровых форматов. Не бойтесь снижать качество: часто изображение по-прежнему хорошо выглядит, а размер файла становится значительно меньше.
  • Удаляйте ненужные метаданные. Многие растровые изображения содержат лишнюю информацию о ресурсе: геоданные, сведения о камере и т. д. Для их удаления используйте соответствующие инструменты.
  • Масштабируйте изображения. Уменьшайте файлы на сервере, чтобы исходный и отображаемый размеры были практически одинаковы. Обратите особое внимание на большие изображения. Если их масштабирует браузер, производительность вашего сайта значительно снижается.
  • Автоматизируйте. Используйте надежные инструменты и ПО, которые будут автоматически оптимизировать изображения на вашем сайте.

Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 3.0 License , and code samples are licensed under the Apache 2.0 License . For details, see our . Java is a registered trademark of Oracle and/or its affiliates.

Обновлено Август 8, 2018

Что делает наш модуль?Основная функция, максимально оптимизировать изображения, при этом практически не потеряв в качестве. Для чего это нужно?Причин несколько:Экономия свободного место на хостинге, т.к. как правило именно изображения "съедают" большую его часть.Соответствие требованиям PageSpeed Insights - требованиям по оптизимизации сайта, для его максимального ранжирования в поисковой системе.Увеличение скорости загрузки страниц, за счет уменьшения загружаемого траффикаК тому же:В июле Google запустит алгоритм Speed Update и обновит mobile-first индекс. В рамках этих обновлений скорость загрузки сайта и его мобильность станет серьезным фактором ранжирования.Проверить, есть ли у вашего сайта проблемы с размером изображений можно:здесьи здесь.Наш модуль OptiImg позволяет уменьшить размер изображений на сайте до 99% без видимой потери качества.Автоматическое сжатие изображений избавит вас от долгого и нудного пересохранения в сторонних приложениях.Никаких квот и ограничений, купите лицензию и конвертируйте столько файлов, сколько потребуется, без пополнений баланса и всяческих доплат!Уважаемые клиенты, обращаем ваше внимание, что лицензионный ключ дает возможность пользоваться нашим сервисом без ограничений, по истечению срока действия лицензионного ключа доступ к сервису будет возможен, но вы не сможете получать обновления для нашего модуля. Так же, обратите внимание, что при покупке продления, клбч в настройках модуля менять не требуется.Модуль работает по принципу "установил и забыл". Любое загруженное в инфоблок изображение будет автоматически сжато!Все изображения оптимизируются в 1 клик, все изображения загруженные в инфоблоки, медиабиблиотеку или при обмене с 1С - будут сжаты автоматически.На данный момент поддерживаются форматы JPEG и PNG.HTTPS - протокол поддерживается.PHP7 - поддерживается.Демо - период позволяет обработать 1000 изображений.Каждый день с помощью нашего модуля для 1C - Bitrix, обрабатывается до 500 тысяч изображений!Проверить уровень сжатия можно на сайте модуля.Обратите внимание, что модуль практически полностью написан на D7, на версиях 1С - Битрикс младше 16 - может работать некорректно. Как начать пользоваться?Чтобы упростить вам жизнь, наша команда всегда готова установить модуль на Ваш сайт под управлением 1С - Битрикс и произвести оптимизацию самостоятельно, для этого, после покупки присылайте запрос на наш e-mail - [email protected] c темой "Установка" , в теле письма укажите код купона и доступы к сайту на котором требуется произвести работы.Уважаемые клиенты!Не забывайте делиться своим опытом использования наших продуктов, оставляйте отзывы, пишите в обсуждения и на наш электронный адрес - [email protected], мы всегда рады вам помочь и получить обратную связь!

От АльфаГрупп

Купить: 2 000 1 800 руб.

Скриншоты


Описание

Технические данные

Опубликовано: 17.10.2015 Обновлено: 28.03.2019 Версия: 1.3.6 Установлено: Более 1000 раз Подходящие редакции: «Первый сайт» , «Старт» , «Стандарт» , «Малый бизнес» , «Эксперт» , «Бизнес» , «Корпоративный портал» , «Энтерпрайз» Адаптивность: Нет Поддержка Композита: Нет

Описание

Что делает наш модуль?

Основная функция, максимально оптимизировать изображения, при этом практически не потеряв в качестве.

Для чего это нужно?

Причин несколько:

  1. Экономия свободного место на хостинге, т.к. как правило именно изображения "съедают" большую его часть.
  2. Соответствие требованиям PageSpeed Insights - требованиям по оптизимизации сайта, для его максимального ранжирования в поисковой системе.
  3. Увеличение скорости загрузки страниц, за счет уменьшения загружаемого траффика
К тому же:

Проверить, есть ли у вашего сайта проблемы с размером изображений можно:

Наш модуль OptiImg позволяет уменьшить размер изображений на сайте до 99% без видимой потери качества.

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

Никаких квот и ограничений, купите лицензию и конвертируйте столько файлов, сколько потребуется, без пополнений баланса и всяческих доплат!

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

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

Модуль работает по принципу "установил и забыл". Любое загруженное в инфоблок изображение будет автоматически сжато!

Все изображения оптимизируются в 1 клик, все изображения загруженные в инфоблоки, медиабиблиотеку или при обмене с 1С - будут сжаты автоматически.

На данный момент поддерживаются форматы JPEG и PNG.

HTTPS - протокол поддерживается.

PHP7 - поддерживается.

Демо - период позволяет обработать 1000 изображений.

Каждый день с помощью нашего модуля для 1C - Bitrix , обрабатывается до 500 тысяч изображений !

Проверить уровень сжатия можно на сайте модуля.

Обратите внимание, что модуль практически полностью написан на D7 , на версиях 1С - Битрикс младше 16 - может работать некорректно.

Как начать пользоваться?

Чтобы упростить вам жизнь, наша команда всегда готова установить модуль на Ваш сайт под управлением 1С - Битрикс и произвести оптимизацию самостоятельно, для этого, после покупки присылайте запрос на наш e-mail - [email protected] c темой "Установка" , в теле письма укажите код купона и доступы к сайту на котором требуется произвести работы.

Уважаемые клиенты!

Не забывайте делиться своим опытом использования наших продуктов, оставляйте отзывы, пишите в обсуждения и на наш электронный адрес - [email protected] , мы всегда рады вам помочь и получить обратную связь!

Отзывы (10)

Общая оценка: Всего отзывов: 10

Хорошее решение для оптимизации картинок

На момент 25,02,2019 решение полностью не рабочее, даже на их сайте http://www.optiimg.ru/ напрямую нельзя сжать изображение, оно зависает после загрузки.

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

Модуль отличный!!!

Как ниже писали, присоединяюсь, да это единственное решение, о котором я не пожалела! Модуль работает шустро, не зависает. Почистила сайт на 3 гб. Было 5 гб стало 2гб.
Супер модуль, молодцы!) Рекомендую)

Отличная техподдержка и крутой модуль

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

Здравствуйте

Техподдержка работает мгновенно, через 10 секунд уже ответили в онлайн чате и ответили на вопросы! Программа огонь, особенно когда много картинок! Всем рекомендую!

Отличная тех поддержка

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

Хорошее решение

Отличное решение! Ребята все сами установили и сжали изображения на 40 %. Спасибо!

Пока единственное решение о покупке которого мы не пожалели

Пока единственное решение о покупке которого мы не пожалели. Очистили 5 гб.

Очень полезный модуль и прекрасная техподдержка!

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

Отличный модуль, отличная поддержка.

Приобрели модуль, тут же подключилась поддержка и все настроила. Благодаря оптимизации фото, Google PageSpeed ставит сайту на большинстве страниц оценку более 80 баллов. Всем рекомендую данное решение.

Отличный модуль

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


Обсуждения (76)

Обсуждения (76)

Купил, оплатил, оптимизировал картинки. Все круто, за исключением одного глюка, который вызывает этот модуль. А именно, когда с морды сайта пытаюсь править товар вылезает фатал еррор

Детальная картинка:
Access to undeclared static property: Alfa1c\Optiimg\OptiImg::$_1260989302 (0)
/home/bitrix/www/bitrix/modules/alfa1c.optiimg/include.php:1
#0: OptiImgEvents::CompressOnResize(array, array, NULL, string, string, boolean)
/home/bitrix/www/bitrix/modules/main/classes/general/module.php:490
#1: ExecuteModuleEventEx(array, array)
/home/bitrix/www/bitrix/modules/main/classes/general/file.php:1705
#2: CAllFile::ResizeImageGet(array, array, integer, boolean)
/home/bitrix/www/bitrix/modules/main/lib/ui/fileinputunclouder.php:40
#3: Bitrix\Main\UI\FileInputUnclouder::getSrcWithResize(array, array)
/home/bitrix/www/bitrix/modules/main/lib/ui/fileinput.php:477
#4: Bitrix\Main\UI\FileInput->getFile(string, string, boolean)
/home/bitrix/www/bitrix/modules/main/lib/ui/fileinput.php:283
#5: Bitrix\Main\UI\FileInput->show(array, boolean)
/home/bitrix/www/bitrix/modules/iblock/admin/iblock_element_edit.php:2539
#6: include(string)
/home/bitrix/www/bitrix/admin/cat_product_edit.php:3

Вылезает не всегда, но оооочень часто. При этом иногда на одном и том же товаре сначала глюк есть, на второй-третий раз глюка нет.

Сергей Заботин, судя по тому, что название функции обфусцировано - вы продолжаете использовать демо - версию, удалите модуль полностью и установите заново, если ошибка сохранится - напишите нам на [email protected] мы вам поможем.

Какие у модуля имеются возможности, если изображения хранятся в "облаках"? Например, если это Selectel?
Насколько я понимаю, модуль сжимает и при загрузке, и при ресайзе, но не сжимает, если изображения уже находятся в "облаках"?
Что планируете в этом направлении?

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

С облаком битрикса работать будет, т.к. битрикс файлы в облаке актуализирует время от времени.

Добрый день
На какой период действует лицензионный ключ? (обновления)

Иван Прилепин, Обновления доступны в течении 1 года, доступ к серверу не ограничен по времени.

1.2.8 версия.

Роман Петров, Пишите нам на email, разберемся.

Купил оптимизатор год назад, тогда воспользовался очень мало, сейчас хотел снова использовать, но у меня вышла ошибка авторизации?! мне что заново его покупать?
Что мне его каждый год покупать ради 100 фотографий?

Роман Петров, Купить продление вы можете, если хотите обновить модуль, если версия модуля старшей 1.2.2, то обновление сделать придется, т.к. в этой версии был большой рефакторинг в ней же сменился сервер к которому наш модуль обращается. Если ваша текущая версия новее, то пишите нам на электронный адрес, [email protected] - разберемся, почему возникает ошибка.

Что нового

1.3.6 (28.03.2019) Исправлены мелкие ошибки в событиях
1.3.5 (15.03.2019) Добавлен вариант более безопасной замены файла
Переписан класс для работы с событиями
1.3.4 (20.01.2019) Добавлена анимация в прогрессбар Удаленые deprecated методы
1.3.3 (12.06.2018) Тест GPSI пернесен на страницу анализа
1.3.2 (06.06.2018) Мелкие исправления
1.3.1 (05.06.2018) Добавлена возможность проверить страницу в GPSI
Опция сжатия через imageJpeg помечена как устаревшая, возможность включить удалена
1.3.0 (24.04.2018) Исправлены ошибки с кириллическими папками.
Небольшие улучшения интерфейса
1.2.9 (22.02.2018) Добавлена корректная обработка ситуации, когда библиотека cURL не установлена на сервере.
1.2.8 (24.01.2017) Исправлена ошибка с правами доступа к модулю
1.2.7 (14.12.2017) Исправлена ошибка, при которой происходило переполнение временными файлами.
1.2.6 (04.12.2017) Улучшена стабильность
1.2.5 (15.11.2017) Изменен способ получения сжатого файла
1.2.4 (30.10.2017) Исправлена ошибка событий сжатия
1.2.3 (25.10.2017) Исправлены ошибки в языковых файлах
1.2.2 (24.10.2017) Изменения в структуре модуля
Рефакторинг под D7
1.2.1 (22.10.2017) Добавлена возможность задать порт
Добавлен фильтр по ошибкам и возможность очистить лог обработки
1.2.0 (20.10.2017) Переписаны методы
Улучшена производительность
Добавлена многопоточность
1.1.9 (17.10.2017) Улучшена стабильность производительность
Исправлены ошибки
1.1.8 (03.10.2017) Исправлена ошибка сохранения позиции
Исправлена ошибка отсылки статистики
1.1.7 (01.10.2017) Большой рефакторинг модуля
Модуль переписан под D7
Изменена структура класса
Улучшена стабильность
Улучшена производительность
Удален устаревший режим файлового менеджера
Добавлен корректный показ ошибок
Исправлены мелкие ошибки
1.1.6 (22.04.2017) Небольшой рефакторинг кода под D7
Исправлена ошибка, при которой сжатие на лету могло не срабатывать, при определенных условиях.
Добавлена возможность исключать директории
1.1.5 (13.04.2017) Исправлены баги
Появилась возможность включить/отключить сжатие на лету в настройках модуля.
ВНИМАНИЕ: если вы используете события сжатия в init.php, перед установкой данного обновления их необходимо удалить!.
1.1.4 (21.03.2017) Исключена необходимость использовать allow_fopen
1.1.3 (19.02.2017) Добавлена возможность вести лог
Добавлена возможность проанализировать сайт перед запуском оптимизации.
1.1.2 (14.02.2017) Исправлена ошибка, привожившая к подмене изображений при установленной галке в инфоблоке, создавать изображение из детального даже если создано.
1.1.1 (30.01.2017) Добавлена возможность указать конкретную папку в упрощенном режиме
Исправлена ошибка при которой не отправлялась статистика на сервер
1.1.0 (30.01.2017) Исправлена ошибка, при которой отправка файлов не прекращалась при отсутствующем ключе.
Исправлена ошибка, при которой не сжимались файлы находящиеся в папке включающей пустые непустые подпапки.
Добавлена возможность продолжать процесс, с последнего обработанного файла.
Улучшена производительность.
Статистика теперь отправляется при загрузке страницы модуля.
1.0.9 (20.01.2017) Исправлена критическая ошибка в режиме файлового менеджера. Исправлена ошибка засорения папки upload при неудачной обработке Добавлена возможность не вести статистику
1.0.8 (15.12.2016) Добавлена поддержка события OnAfterResizeImage для сжатия изображений, измененных с помощью метода ResizeImageGet.
1.0.7 (14.12.2016) Исправлена ошибка с шаблоном постраничной навигации
1.0.6 (19.10.2016) Исправлена работа с расширениями верхнего регистра. Добавлена возможность пропускать битые файлы в упрощенном режиме.
1.0.5 (25.04.2016) Новый интерфейс
1.0.4 (16.02.2016) Исправлены проблемы с отображением ошибок
1.0.3 (14.02.2016) Переработан интерфейс
Добавлена возможность сжатия через функцию imagejpeg
Исправлены баги
Улучшены некоторые функции, добавлены новые
1.0.2 (02.02.2016) Добавлена постраничная навигация для разделов

Установка

Установка стандартная из Marketplace.

Доступ к модулю осуществляется через раздел

Сервис -> Оптимизатор изображений либо по ссылке:
/bitrix/admin/optiimg_admin.php

Настройки модуля:
/bitrix/admin/settings.php?lang=ru&mid=alfa1c.optiimg&mid_menu=1

Обратите внимание, что для работы модуля необходимо в поле "Ключ" ввести ключ полученный на почту после покупки.

Решение использует библиотеку cURL, как правило она включена по умолчанию, если нет, обратитесь за помощью к вашему хостеру, либо системному администратору.

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

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

Поддержка

Как пользоваться нашим модулем правильно:

  1. Устанавливаете модуль из маркетплейс.
  2. Переходите по адресу /bitrix/admin/settings.php?lang=ru&mid=alfa1c.optiimg&mid_menu=1
  3. Задаете качество сжатия, устанавливаете галочки Сжимать изображения при загрузке и Сжимать изображения при ресайзе, если ваш сайт работает по https протоколу то в поле порт вписываете 443 либо оставляете пустым.
  4. Переходите в файловый менеджер и удаляете папку /upload/resize_cache/
  5. Переходите в интерфейс работы с модулем /bitrix/admin/optiimg_admin.php
  6. Нажимаете кнопку Оптимизировать
  • Обработка изображений
  • Поводом для данной статьи стал следующий пост: . В свое время, мне немало пришлось написать исследовательского кода на C#, который реализовывал различные алгоритмы сжатия, обработки. То, что код исследовательский, я упомянул не случайно. У этого кода своеобразные требования. С одной стороны, оптимизация не очень важна – ведь важно проверить идею. Хотя и хочется, чтобы эта проверка не растягивалась на часы и дни (когда идет запуск с различными параметрами, либо обрабатывается большой корпус тестовых изображений). Примененный в вышеупомянутом посте способ обращения к яркостям пикселов bmp.GetPixel(x, y) – это то, с чего начинался мой первый проект. Это самый медленный, хотя и простой способ. Стоит ли тут заморачиваться? Давайте, замерим.

    Использовать будем классический Bitmap (System.Drawing.Bitmap). Данный класс удобен тем, что скрывает от нас детали кодирования растровых форматов – как правило, они нас и не интересуют. При этом поддерживаются все распространенные форматы, типа BMP, GIF, JPEG, PNG.

    Кстати, предложу для начинающих первую пользу. У класса Bitmap есть конструктор, который позволяет открыть файл с картинкой. Но у него есть неприятная особенность – он оставляет открытым доступ к этому файлу, поэтому повторные обращения к нему приводят к эксепшену. Чтобы исправить это поведение, можно использовать такой метод, заставляющий битмап сразу «отпустить» файл:

    Public static Bitmap LoadBitmap(string fileName) { using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read)) return new Bitmap(fs); }

    Методика замеров

    Замерять будем, перегоняя в массив и обратно в Bitmap классику обработки изображений – Лену (http://en.wikipedia.org/wiki/Lenna). Это свободное изображение, его можно встретить в большом количестве работ по обработке изображений (и в заголовке данного поста тоже). Размер – 512*512 пикселов.

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

    Компилируем код в Release. Запускаем его обязательно не из-под студии. Более того, студию также желательно закрыть – сталкивался со случаями, когда сам факт её «запущенности» иногда сказывается на полученных результатах. Также, желательно закрыть и другие приложения.

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

    «Наивный» метод

    Именно этот метод был применен в оригинальной статье. Он состоит в том, что используется метод Bitmap.GetPixel(x, y). Приведем полностью код подобного метода, который конвертирует содержимое битмапа в трехмерный байтовый массив. При этом первая размерность – это цветовая компонента (от 0 до 2), вторая – позиция y, третья – позиция x. Так сложилось в моих проектах, если вам захочется расположить данные иначе – думаю, проблем не возникнет.

    Public static byte[,] BitmapToByteRgbNaive(Bitmap bmp) { int width = bmp.Width, height = bmp.Height; byte[,] res = new byte; for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { Color color = bmp.GetPixel(x, y); res = color.R; res = color.G; res = color.B; } } return res; }

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

    100 преобразований в изображение и обратно на моем ноутбуке с процессором I5-2520M 2.5GHz, требуют 43.90 сек. Получается, что при изображении 512*512, только на перенос данных, тратится порядка полусекунды!

    Прямая работа с данными Bitmap

    К счастью, класс Bitmap предоставляет более быстрый способ обратиться к своим данным. Для этого нам необходимо воспользоваться ссылками, предоставляемыми классом BitmapData и адресной арифметикой:

    Public unsafe static byte[,] BitmapToByteRgb(Bitmap bmp) { int width = bmp.Width, height = bmp.Height; byte[,] res = new byte; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try { byte* curpos; for (int h = 0; h < height; h++) { curpos = ((byte*)bd.Scan0) + h * bd.Stride; for (int w = 0; w < width; w++) { res = *(curpos++); res = *(curpos++); res = *(curpos++); } } } finally { bmp.UnlockBits(bd); } return res; }

    Такой подход дает нам получить 0.533 секунды на 100 преобразований (ускорились в 82 раза)! Думаю, это уже отвечает на вопрос – а стоит ли писать более сложный код преобразования? Но можем ли мы еще ускорить процесс, оставаясь в рамках managed-кода?

    Массивы vs указатели

    Многомерные массивы являются не самыми быстрыми структурами данных. Здесь производятся проверки на выход за пределы индекса, сам элемент вычисляется, используя операции умножения и сложения. Поскольку адресная арифметика уже дала нам один раз существенное ускорение при работе с данными Bitmap, то может быть, попробуем её применить и для многомерных массивов? Вот код прямого преобразования:

    Public unsafe static byte[,] BitmapToByteRgbQ(Bitmap bmp) { int width = bmp.Width, height = bmp.Height; byte[,] res = new byte; BitmapData bd = bmp.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb); try { byte* curpos; fixed (byte* _res = res) { byte* _r = _res, _g = _res + width*height, _b = _res + 2*width*height; for (int h = 0; h < height; h++) { curpos = ((byte*)bd.Scan0) + h * bd.Stride; for (int w = 0; w < width; w++) { *_b = *(curpos++); ++_b; *_g = *(curpos++); ++_g; *_r = *(curpos++); ++_r; } } } } finally { bmp.UnlockBits(bd); } return res; }

    Результат? 0.162 сек на 100 преобразований. Так что ускорились еще в 3.3 раза (270 раз по сравнению с «наивной» версией). Именно подобный код и использовался мною при исследованиях алгоритмов.

    Зачем вообще переносить?

    Не совсем очевидно, а зачем вообще переносить данные из Bitmap. Может вообще, все преобразования осуществлять именно там? Соглашусь, что это один из возможных вариантов. Но, дело в том, что многие алгоритмы удобнее проверять на данных с плавающей запятой. Тогда нет проблем с переполнениями, потерей точности на промежуточных этапах. Преобразовать в double/float-массив можно аналогичным способом. Обратное преобразование требует проверки при конвертации в byte. Вот простой код такой проверки:

    Private static byte Limit(double x) { if (x < 0) return 0; if (x > 255) return 255; return (byte)x; }

    Добавление таких проверок и преобразование типов замедляет наш код. Версия с адресной арифметикой на double-массивах исполняется уже 0.713 сек (на 100 преобразований). Но на фоне «наивного» варианта – она просто молния.

    А если нужно быстрее?

    Если нужно быстрее, то пишем перенос, обработку на C, Asm, используем SIMD-команды. Загружаем растровый формат напрямую, без обертки Bitmap. Конечно, в этом случае мы выходим за пределы Managed-кода, со всеми вытекающими плюсами и минусами. И делать это имеет смысл для уже отлаженного алгоритма.

    Update 2013-10-08:
    По предложению комментаторов, добавил в код вариант переноса данных в массив с помощью Marshal.Copy(). Это сделано чисто с тестовыми целями - у такого способа работы есть свои ограничения:

    • Порядок данных точно такой же, как и в оригинальном Bitmap. Т.е., компоненты перемешаны. Если мы хотим их отделить друг от друга - нужно будет все-равно проходиться циклом по массиву, копируя данные.
    • Тип у яркости остается byte, в то же время, часто бывает удобно промежуточные вычисления выполнять с плавающей запятой.
    • Marshal.Copy() работает с одномерными массивами. Да, они конечно самые быстрые и не очень сложно везде писать rgb, но все-таки...
    Итак, копирование в две стороны происходит за 0.158 сек (на 100 преобразований). По сравнению с более гибким вариантом на указателях, ускорение очень небольшое, в пределах статистической погрешности результатов разных запусков.




    

    2024 © gtavrl.ru.