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

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

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

Настройка среды разработки

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

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

npm install

Затем установите Sharp, выполнив следующую команду:

instagram viewer
npm install sharp

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

Методы сжатия для разных форматов изображений

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

JPG/JPEG

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

Чтобы сжать изображение JPEG с помощью Sharp, импортируйте модуль Sharp и передайте путь к файлу или буфер изображения в качестве аргумента. Далее позвоните в .jpeg метод на Острый пример. Затем передайте объект конфигурации с качество свойство, которое принимает число между 0 и 100 как ценность. Где 0 возвращает наименьшее сжатие с самым низким качеством и 100 возвращает максимальное сжатие с высочайшим качеством.

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

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

Например:

await sharp(req.file.path)
.jpeg({ quality: 60 })
.toFile(`./images/compressed-${req.file.filename}`)
.then(() => {
console.log(`Compressed ${req.file.filename} successfully`);
});

Значение по умолчанию для качество является 80.

PNG

PNG (Portable Network Graphics) — это формат файлов изображений, известный своим сжатием без потерь и поддержкой прозрачного фона.

Сжатие изображения PNG с помощью Sharp аналогично сжатию изображения JPEG с помощью Sharp. Однако если изображение имеет формат PNG, необходимо внести два изменения.

  1. Sharp обрабатывает изображения PNG с помощью .png метод вместо .jpeg метод.
  2. .png метод использует уровень сжатия, это число между 0 и 9 вместо качество в своем объекте конфигурации. 0 обеспечивает максимально быстрое и максимальное сжатие, в то время как 9 обеспечивает самое медленное и минимальное сжатие.

Например:

await sharp(req.file.path)
.png({
compressionLevel: 5,
})
.toFile(`./images/compressed-${req.file.filename}`)
.then(() => {
console.log(`Compressed ${req.file.filename} successfully`);
});

Значение по умолчанию для уровень сжатия является 6.

Другие форматы

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

  • ВебП: Сжатие изображений WebP с помощью Sharp происходит по тому же процессу, что и JPG. Единственная разница в том, что вам придется позвонить в веб-сайт метод вместо .jpeg метод на экземпляре Sharp.
  • ТИФФ: Сжатие изображений TIFF (Tag Image File Format) с помощью Sharp происходит по тому же процессу, что и JPG. Единственная разница в том, что вам придется позвонить в размолвка метод вместо .jpeg метод на экземпляре Sharp.
  • АВИФ: Сжатие изображений AVIF (формат файла изображения AV1) с помощью Sharp осуществляется по тому же процессу, что и JPG. Единственная разница в том, что вам придется позвонить в живо метод вместо .jpeg метод на экземпляре Sharp. Значение AVIF по умолчанию для качество является 50.
  • ХИФ: Сжатие изображений HEIF (высокоэффективный формат файлов изображений) с помощью Sharp осуществляется по тому же процессу, что и JPG. Единственная разница в том, что вам придется позвонить в телка метод вместо .jpeg метод на экземпляре Sharp. Значение AVIF по умолчанию для качество является 50.

Сжатие изображений с помощью Sharp

Если вы клонировали репозиторий GitHub, откройте свой приложение.js файл и добавьте следующий импорт.

const sharp = require("sharp");
const { exec } = require("child_process");

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

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

Далее замените POST ‘/single’ обработчик с блоком кода ниже:

app.post("/upload-and-compress", upload.single("image"), async (req, res) => {
try {
if (!req.file) {
return res.status(404).send("Please upload a valid image");
}

const compressedFileName = req.file.filename.split(".")[0];
const compressedImageFilePath = `./images/${compressedFileName}-compressed.png`;

await sharp(req.file.path)
.jpeg({ quality: 50 })
.toFile(compressedImageFilePath)
.then(() => {
let sizeBeforeCompression, sizeAfterCompression;
const sizeBeforeCompressionCommand = `du -h ${req.file.path}`;
const sizeAfterCompressionCommand = `du -h ${compressedImageFilePath}`;

exec(sizeBeforeCompressionCommand, (err, stdout, stderr) => {
sizeBeforeCompression = stdout.split("\\t")[0];

exec(sizeAfterCompressionCommand, (err, stdout, stderr) => {
sizeAfterCompression = stdout.split("\\t")[0];

res.send({
message: "Image uploaded and compressed successfully",
sizeBeforeCompression,
sizeAfterCompression,
});
});
});
});
} catch (error) {
console.log(error);
}
});

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

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

Запустите службу загрузки, выполнив следующую команду:

node app.js

Затем протестируйте свое приложение, отправив изображение JPG по маршруту. локальный хост:/upload-and-compressс помощью клиентского приложения Postman или любой другой инструмент тестирования API.

Вы должны увидеть ответ, похожий на этот:

{
"message": "Image uploaded and compressed successfully",
"sizeBeforeCompression": "13M",
"sizeAfterCompression": "3.1M"
}

Другие варианты использования модуля Sharp

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