Автоматическая оптимизация изображений

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

Что делает данный компонент?
Оптимизация изображения для сайта — это уменьшение объема изображения без видимой потери качества.
При загрузке файла через файловый менеджер или тв-поле в ресурсе файла изображения (jpg/png), он автоматически его оптимизирует.

Что использует?
В основе компонента используется api-компонент к сервису TinyPNG, но с небольшими доработками.
Бесплатный план api позволяет загружать 500 изображений в месяц, а дальше оплата за каждое изображение (1000 изображений в месяц — 4,5$, 2000 — 13,5$). Без ограничений загрузки в месяц, можно это делать вручную через их сайт, но с ограничениями: размер файла не должен превышать 5MB и не более 20 за раз.

Их API я доработал под второй вариант — имитация ручной загрузки через их сайт.
Также Вы можете использовать и обычный вариант с бесплатным/платным api — для этого вам в системных настройках необходимо указать Ваш ключ api в параметре «tinycompressor_api_key». Чтобы вернуться к имитации работы через браузер, указать в этом параметре «crazy».

Насколько эффективно?
Во время тестирования использовал тот и другой способ. По результатам: 10мб превратились 700кб.

Планируется ли доработка до ума?
Компонент пока находится в beta-версии и сыроват.
При наличии времени, чего всегда не хватает, планируется его доработка до следующих возможностей:
  • Ресайзинг изображения по умолчанию/заданным параметрам
  • Отключение/Включение оптимизации по выбору
  • Оптимизация уже загруженных изображений через файловый менеджер
  • Сохранения на Amazon S3
Если будут идеи, что еще можно в него внедрить — пишите, буду думать.

Пакет на modstore.ru
Проект на GitHub.com

UPD_1: готовый пакет обновлен для работы с minishop2
UPD_2: Обновлена версия пакета, проведена интеграция в phpThumb
UPD_3: Обновлена ссылка загрузки для режима имитации
UPD_4: Пакет добавлен на modstore.pro
UPD_5: Компонент временно отключен до выполнения доработок
UPD_6 (10/12/2017): Компонент обновлен до версии 2.0.2-beta.
Alexey Medvedev
21 августа 2017, 17:14
modx.pro
13
9 799
+14

Комментарии: 63

Сергей
21 августа 2017, 22:53
0
Почти такой же результат оптимизации можно получить при использовании pngquant, действуют они по одинаковому принципу. А если добавить gifsicle, jpegtran и svgo то можно получить универсальный инструмент для сжатия. Эти модули, например, использует пакет imagemin для nodejs.
    Alexey Medvedev
    21 августа 2017, 23:34
    0
    Всё было бы отлично, если бы Вы использовали свой сервер, который можете настроить под себя — тогда и использование многих компонентов не требовалось. К тому же сжатие pngquant в php делается через shell_exec. Да и пихать в неё неизвестный файл (загружаемый пользователем) через shell — это как «кинуть булыжник в стекло» в плане безопасности, где стекло это защита сервера. Всё равно, спасибо за Ваш комментарий, я для себя поставил заметку, что можно использовать дополнительные классы для компрессии изображения на выбор пользователя в зависимости от настроек сервера.
      Александр
      22 августа 2017, 09:13
      0
      Ключевая фраза «почти». Знаете, я перепробывал около 6 компрессоров png формата, но ни один не достиг результатов tinypng. Сдается мне там или 2 софта поочередно обрабатывают одну картинку, или что-то свое.
      Основа понятна, у все софтины одна, режутся каналы… А вот на столько ужать png без визуальной потери качества…
      Konstantin
      22 августа 2017, 06:52
      0
      Чет установил, и ничего…
      Изображение загруженное без этого компонента:
      Размеры 1620 × 1080, 359 063 Б (360 КБ на диске)
      Изображение загруженное с компонентом:
      Размеры 1620 × 1080, 503 611 Б (504 КБ на диске)
      Upd. Если это фотографии товара minishop2 – оптимизация не происходит, а если эти же фото загрузить через диспетчер файлов, то они будут оптимизированы.
        Alexey Medvedev
        22 августа 2017, 07:02
        0
        Пожалуйста, если Вас не затруднит, отправьте изображение на daddy@fuckthesystem.ml
        Спасибо.
          Alexey Medvedev
          22 августа 2017, 07:06
          0
          Я тогда предполагаю, что minishop2 использует другой способ загрузки файлов, не использующий 'uploadObjectsToContainer' в xPDO. Поковыряю его, тоже.
            Konstantin
            22 августа 2017, 07:12
            0
            хз, отписался на почту. Как по мне, очень крутая штука, но если не работает с галлереей минишопа, то…
              Alexey Medvedev
              22 августа 2017, 07:19
              0
              Я просмотрю, как в minishop2 загружаются изображения. Вы используете ms2Gallery для работе с галереей или встроенную в minishop2?
                Konstantin
                22 августа 2017, 07:21
                0
                Встроенную.
                  Александр
                  22 августа 2017, 09:09
                  0
                  увы, подцепиться там негде, тоже смотрел. У родной галереи ms2 нет эвентов, ставил эвент на сохранение ресурса.
                  Очень интересное решение с имитацией. Цена на tinypng кусается. От части Вы не правы (по поводу своего сервера).
                  У меня шаред beget. Я через docker поставил и pngnq и jpegopti. Все прекрасно работает. Хотел позже статью про оптимизацию написать, уже даже начал, но все времени не найду дописать…
                    Alexey Medvedev
                    22 августа 2017, 09:48
                    0
                    Обновил компонент для работы с minishop2 галереей. Уточню у Василия почему он использует 'createObject', вместо 'uploadObjectsToContainer'. Event-плагин при загрузке файла в галерее minishop нужно вешать на событие 'OnFileManagerFileCreate'
                      Konstantin
                      22 августа 2017, 09:50
                      0
                      а как обновится?
                        Konstantin
                        22 августа 2017, 09:56
                        0
                        Спасибо, письмо получил, но там не архив а папка, упаковал в архив, но при попытке загрузки пишет:
                        2 This file [tinycompressor-1.0.0-beta1.zip] does not appear to be a transport package.
                          Alexey Medvedev
                          22 августа 2017, 10:05
                          0
                          yadi.sk/d/21zsiED_3MDcdi — тут транспортный пакет.
                          Обновиться просто. Откройте Установщик в админке, найдите пакет tinycompressor, нажмите удалить, принудительное удаление, загрузите новый пакет и установите.
                          К сожаление, не успел написать логику на обновление.

                          UPD: отправил на почту транспортный пакет.
                            yani
                            27 октября 2017, 00:33
                            0
                            Скачала с Гита посл.версию, установила на сайт.
                            Загружаю картинку в Минишоп галерею, потом скачиваю то, что является оригиналом. сравниваю размер закачанной с той, что скачала с сайта. Размеры одинаковые. ЧЯДНТ?
                            Через modx аплоадер уменьшает немного вес, вроде бы под минишоп поправили Вы?
                              Alexey Medvedev
                              28 октября 2017, 13:39
                              0
                              На гите последняя опубликованная версия в ней есть ошибки в том числе при работе с галереей minishop. Ожидайте выход новой версии, можете отслеживать GitHub — пакет выйдет туда в первую очередь.
                        Konstantin
                        22 августа 2017, 09:49
                        0
                        Надо к @bezumkin обратится, может он добавит эвент.
                          Alexey Medvedev
                          22 августа 2017, 10:09
                          0
                          Он использует другой способ загрузки файлов из xPDO. Я уже написал ему.
                          Нет смысла создавать новый event. В том способе используется другой event — 'OnFileManagerFileCreate'. Просто при написании плагина, я проверял компоненты fastuploadtv и gallery, даже не предполагал, что будет использоваться функция 'createObject' из класса 'modFileMediaSource' в каких-то компонентах.
                          Alexey Medvedev
                          22 августа 2017, 10:20
                          +1
                          Я не про то, что будет плохо работать или не будет работать, а про то, что нужно учитывать и возможности других пользователей. Да, можно настроить сервер для оптимизации через shell и это будет безопасно. Но не все пользователи понимают, как правильно настроить сервер. Компонент рассчитан на использование в массах. В дальнейшем сделаю использование разных компрессоров, не только tinypng. Например, как при работе с кэшем — можно использовать APC/MemCache или написать свой — тут будет по аналогии, просто указать класс для работы с компонентом.
                            Александр
                            22 августа 2017, 13:55
                            0
                            Александр, очень хочется почитать про оптимизацию. Вы уж постарайтесь время найти )
                    Виталий Батушев
                    22 августа 2017, 15:33
                    0
                    А не проще добавить модуль pagespeed? Там кроме оптимизации изображений, столько всякого оптимизаторского есть, что просто праздник какой-то.
                      Alexey Medvedev
                      22 августа 2017, 15:42
                      +3
                      PageSpeed это компонент для веб-сервера. При наличии прямых рук и полного управления сервером — его можно прикрутить к чему угодно. Для NGINX вообще необходима сборка из исходников. К тому же PageSpeed оптимизирует на выходе, а не на входе — это значит, что страница будет оптимизирована во время генерации, но изображения на сервере будут иметь тот же размер и вид.
                      Tinycompressor — это компонент для обычных пользователей. Он помогает не только оптимизировать изображение, но и сохранить место на диске.

                      Уже обсуждалось ранее, что при наличии своего сервера — можно сделать всё, что угодно, если ты разбираешься в этом. Но очень не много разработчиков обладают навыками администрирования unix-систем.

                      Konstantin
                      31 августа 2017, 19:31
                      0
                      Пробовал устанавливать?
                      типа вносишь в конфиг сервера
                      bash <(curl -f -L -sS https://ngxpagespeed.com/install) \
                           --nginx-version latest
                      и все на выходе оптимизируется?
                        Виталий Батушев
                        31 августа 2017, 19:35
                        0
                        Это ты команда сборки и установки nginx с модулем pagespeed. После того, как установится, да, будет оптимизироваться согласно твоим установкам. Там много вкусного. Правда, с кешированием я до конца не разобрался. Вот, например: szam5.com/
                          Konstantin
                          31 августа 2017, 19:48
                          0
                          Ерунда. После твоего комментария, я подумал что этот модуль вообще огонь, а он: Удалите js и css, используйте кеш браузера…
                            Alexey Medvedev
                            31 августа 2017, 19:52
                            0
                            Я предполагаю, что Вы не правильно его установили.
                      Василий Столейков
                      23 августа 2017, 05:44
                      0
                      Почему на загрузите пакет в Modstore?
                      Уверен, так для многих будет удобнее и обновлять и использовать в будущем!
                      P.S. Сам компонент улётный — спасибо большое!
                        Alexey Medvedev
                        23 августа 2017, 07:08
                        +1
                        Уже отправлена на рассмотрении новая версия с интеграцией в phpThumbOn — будут сжиматься также изображения, которые уже выдаются пользователю.
                          Василий Столейков
                          23 августа 2017, 07:09
                          0
                          Круто, оперативно! Спасибо!
                            Alexey Medvedev
                            23 августа 2017, 07:11
                            0
                            Он у Вас работает? Вы использовали собранный компонент или собирали из исходников?
                            Спрашиваю не просто так. Дело в том, что TinyPNG сменили url для загрузки по ручному режиму вчера (совпадение).

                            Обновил готовый пакет здесь.
                            — Обновлен URL загрузки при имитации
                            — Добавлена интеграция в phpThumb
                            — Добавлен отлов исключений и скидывания их в лог ошибок.
                              Василий Столейков
                              23 августа 2017, 07:24
                              0
                              Не работает. Качал с Яндекса, не сжимает. Режим crazy, файлы разные, от мегабайта до 14 мб.
                                Alexey Medvedev
                                23 августа 2017, 07:38
                                +2
                                Удалите старый пакет. И скачайте новый или дождитесь появления на modstore. Файлы свыше 5МБ сжимать не будет — ограничение ручного режима сайта, только по API большие файлы.
                                И это кстати неплохой фикс. Использовать ключ для больших файлов (свыше 5MB) — отправлено в задачи.
                      Alexey Medvedev
                      23 августа 2017, 11:52
                      0
                      UPD_3: TinyPNG обновили ссылку для загрузки файлов. Видно вчера забыл её учесть и поправил компонент у себя на сервере. Удалите компонент у себя и установите новую версию (она называется также 1.0.1-beta, время создание 23.08.2017 11:36) или дождитесь выхода компонента на modstore.
                        Alexey Medvedev
                        31 августа 2017, 21:56
                        0
                        Компонент временно отключен до выполнения доработок.
                          Александр
                          01 сентября 2017, 14:50
                          0
                          Есть причины? Вернее какие причины? Хотел попробовать но пока безуспешно
                            Alexey Medvedev
                            01 сентября 2017, 18:58
                            0
                            Поступила жалоба на высокую нагрузку на систему и ошибки, после обследования заявленных проблем не выявлено. Закрыл на время обследования и обновление. Выйдет уже в версии 2.0 с новыми функциями и возможностью оптимизацией больших файлов.
                              Павел
                              10 сентября 2017, 14:07
                              0
                              Когда релиз ожидается примерно?
                                Alexey Medvedev
                                10 сентября 2017, 19:49
                                +1
                                Ориентировочно к 1 октябрю.
                                  Дмитрий Вершинин
                                  01 октября 2017, 03:38
                                  0
                                  Как раз прочитал этот топик перового октября :)
                                  Алексей, подскажите пожалуйста, что с планом по выпуску компонента? :)
                                    Alexey Medvedev
                                    01 октября 2017, 10:26
                                    +1
                                    Думаю в течении ближайшей недели залью в репозиторий его.
                                    Добавлена новая основная функция — сжатие pdf-файлов.
                          yani
                          25 октября 2017, 12:18
                          0
                          Когда ожидать коммит?
                            Alexey Medvedev
                            25 октября 2017, 14:02
                            0
                            Приношу свои извинения за ожидание. Компонент сейчас активно тестируется на рабочем проекте. Возникли некоторые сложности с MIGx и динамическими путями. Как только решу проблему, сделаю коммит и сборку компонента.
                              yani
                              25 октября 2017, 15:11
                              0
                              Алексей, спасибо! Ожидаем
                            Константин Ильин
                            09 декабря 2017, 13:46
                            0
                            Перепробовал разные плагины для галп — все равно ругается пейджспид. Честно говоря он всех уже достал. Советует плагины для галпа которые нихера в итоге не сжимают как ему надо.

                            TinyPNG изображения от него воспринимает более менее, не 100% но подавляющее большинство.

                            Хочется уже увидеть компонент.

                            оффтоп: Есть ли у кого нибудь код и нормальный рабочий вариант связки плагинов для gulp?
                              Илья Уткин
                              09 декабря 2017, 14:18
                              +1
                              Я тут разработал компонент по интеграции optipic.io и MODX. После одобрения модератором сделаю анонс. Следите за новостями. Вроде, гугл хорошо воспринимает оптимизированные таким компонентом картинки.
                                Константин Ильин
                                09 декабря 2017, 15:06
                                0
                                будет отлично Илья! начну сам читать) ато прям не терпится)
                                  Илья Уткин
                                  09 декабря 2017, 15:10
                                  0
                                  Купон на скидку 10% — ILYAUT
                                    Илья Уткин
                                    09 декабря 2017, 15:26
                                    0
                                    Да, я потому и заморочился — стандартный функционал индексации не использую, а отправляю на оптимизацию только нужные файлы, а не вообще все, какие есть в папках на диске
                                      Константин Ильин
                                      09 декабря 2017, 15:57
                                      0
                                      Все таки панда, к большому сожалению сжимает сильнее

                                      Одно и тоже изображение:
                                      Панда = 709.7 KB
                                      optipic.io = 2,86 МБ
                                        Илья Уткин
                                        11 декабря 2017, 14:16
                                        0
                                        Видимо, OptiPic лучше сжимает небольшие изображения.

                                        Вот этот файл, например, даёт такие результаты:

                                        TinyJPG: 57.5 KB (-9%)
                                        OptiPic: 14,89 КБ (-76%)
                                          Alexey Medvedev
                                          11 декабря 2017, 15:31
                                          0
                                          Не совсем так. Тоже прошелся по Вашей картинке и тем и другим, только у TinyPNG — сжатие -31%. OpticPic — сжал меньше за счет потери качества — визуально почти не отличается из-за низкого разрешения. Тут всё индивидуально, в некоторых случаях будет лучше opticpic, в других TinyPNG :)
                                    Alexey Medvedev
                                    09 декабря 2017, 15:21
                                    0
                                    Только один минус в этом сервисе — это тарифы :(
                                      Илья Уткин
                                      09 декабря 2017, 15:27
                                      0
                                      Промазал) ответил вам чуть выше
                                        Alexey Medvedev
                                        09 декабря 2017, 15:47
                                        0
                                        Бывает :) Я же сделал наоборот все загружаемые файлы отправляются на сжатия (для экономии места), но во время тестирования на большом проекте — возникли сложности, потому что разные компоненты используют разные схемы загрузки — пришлось подстраиваться. Сейчас компонент работает стабильно, добавлена возможность отключения сжатия всех загружаемых файлов (т.к. иногда этого не требуется), при этом оставив отправку на сжатие всех изображений созданных через библиотеку phpThumb. Но, к сожалению, из-за плотного расписания — нет времени сделать нормальную сборку.

                                        Я, как и Вы, использовал способ через внешний сервис, к сожалению, такой подход оставляет некоторый негатив (у меня), т.к. хотелось бы достичь эффекта хорошей оптимизации за счет компонентов самого сервера, но без использования правильной настройки сервера — это никак не организовать.
                                          Константин Ильин
                                          09 декабря 2017, 16:06
                                          0
                                          Правильно я понимаю Вас Алексей, что возможно настроить vds или просто сервак так, чтобы при сжатии все было ок? если да, то поделитесь пожалуйста инструкшоном) ато этот маразматический pagespeed достал
                                            Alexey Medvedev
                                            09 декабря 2017, 16:20
                                            +1
                                            Если Вас достал pagespeed и есть возможность самому настроить свой сервер, то я бы рекомендовал без «танцев с бубном» собрать nginx с модулем pagespeed. Тогда все отдаваемые изображение будут сжиматься и контент будет автоматически оптимизироваться. Но учтите, что это влечет нагрузки на сервер и VDS начнет подтормаживать при ограниченных ресурсах.
                                              Константин Ильин
                                              09 декабря 2017, 16:35
                                              0
                                              Спасибо за совет
                                              Ставил тот модуль, может не так настраивал, он все равно ругался на свои же изображения. Ставил на апач конечно.
                                              А так конечно не стоит нагружать сервак, сжать один раз изображения и забыть. Интересно есть ли возможность этим модулем сжимать изображения так сказать в «ручную»? т.е. использовать его API
                                                Alexey Medvedev
                                                09 декабря 2017, 17:02
                                                0
                                                К сожалению, в «ручную» нет. Там можно настроить фильтры, но это то ещё занятие. Apache — уже давно не использую, предпочитаю связку nginx+php-fpm
                                  Alexey Medvedev
                                  10 декабря 2017, 22:32
                                  +1
                                  Уважаемые члены сообщества!

                                  Наконец-то компонент обновлен до версии 2.0.1-beta.
                                  Более подробная информация о новой версии

                                  Спасибо Вам за терпение.
                                    Alexey Medvedev
                                    10 декабря 2017, 23:53
                                    0
                                    К сожалению, возникли проблемы с TinyPNG
                                      Alexey Medvedev
                                      11 декабря 2017, 03:39
                                      +1
                                      Все проблемы устранены. Не надо было спешить выпускать :(
                                    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                                    63