IwanQ
@IwanQ
Плохие времена часто дают прекрасные возможности

Как эффективно сжимать изображения в nodejs?

Доброго времени суток.

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

Но вот возникла проблема.

Мой код:
sharp()
    .withMetadata()
    .jpeg({ quality: 50, force: false })
    .png({ compressionLevel: 9, force: false })
    .webp({ quality: 50, force: false })
    .toBuffer();


С jpeg и webp все работает корректно, но вот png вообще не хотят сжиматься. А иногда даже наоборот, после сжатия становятся больше по размеру.

Пробовал с разными опциями, результата нет. Ставил quality: 50 - не работает, в том числе и с  palette в true. Но стоит отметить, поставил как-то опцию adaptiveFiltering в true, на несколько килобайт картинки стали весить меньше.

Я так понимаю в целом nodejs не создан для таких задач, как сжимать картинки, но все-же, в чем может быть причина того, что png не сжимаются?
  • Вопрос задан
  • 33 просмотра
Решения вопроса 1
WblCHA
@WblCHA
Сир, вы творите какую-то дичь.
Сначала изображение конвертируете в жипег с 50% качеством, затем в пнг с использованием лослесс компрессией, и в финале конвертацияя в вебп опять с 50% качеством.
После всего этого я более чем уверен, что сохраняете вы всё с изначальным расширением файла, иными словами результирующий вебп конвертируете в жипег / пнг. А с учётом того, что пнг является несжимаемым, то каким образом вы ожидаете получить пнг с намного меньшим объёмом?

sharp()
    .withMetadata()
    .jpeg({ quality: 50 })
    .toFile(path.join(__dirname, `some/path/${filename}.jpg`));


П.с.: рекомендую читать документацию: https://sharp.pixelplumbing.com/api-output#jpeg
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
от 50 000 до 100 000 ₽
ai.people Санкт-Петербург
от 120 000 до 220 000 ₽
08 мар. 2021, в 12:56
2000 руб./за проект
08 мар. 2021, в 12:35
50000 руб./за проект
08 мар. 2021, в 11:59
15000 руб./за проект