Как преобразовать jpeg в прогрессивное изображение в JavaScript?

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

Я пробовал некоторые библиотеки, такие как 'gm' what user imagemagic, но они не работали, поэтому я хочу знать, есть ли способ сделать это.


person Juan M. González R.    schedule 19.01.2021    source источник
comment
Я предполагаю, что вы попробовали код в этом ответе. Что не сработало для вас?   -  person OfirD    schedule 27.01.2021
comment
Что вы имеете в виду о приложении? Вы ожидаете, что загрузка конвертации будет выполняться в браузере или на бэкэнде? Если вам нужна конверсия в браузере, я думаю, что Compressorjs — хороший вариант.   -  person Jose Marin    schedule 28.01.2021
comment
Если вы планируете сжимать изображение в браузере, это может быть хорошим решением. npmjs.com/package/compressorjs, npmjs.com/package/browser-image-compression   -  person Swaraj Gandhi    schedule 01.02.2021


Ответы (3)


Вы можете использовать модуль sharp, он имеет много функций и действительно хороший. Если вы просто хотите преобразовать в прогрессивный JPEG, тогда

const sharp = require("sharp")

const main = async () => {
  try {
    const data = await sharp('10.jpg')
      .jpeg({
        quality: 100, // adjust the quality
        progressive: true
      })
      .toBuffer();
    await sharp(data).toFile('output.jpg')
  } catch(error) {
    console.log(error)
  }
}

main()

Ссылка на повтор для кода.

person Bibash Adhikari    schedule 01.02.2021

У меня есть еще один функциональный пример: когда изображение попадает в корзину S3, оно запускается лямбдой (Node JS), которая также использует lib sharp для оптимизации размера изображения, а затем публикует новое изображение в другой папке в s3. Вот пример:

"use strict";

const AWS = require("aws-sdk");
const sharp = require("sharp");
const { basename, extname } = require("path");

const S3 = new AWS.S3();

module.exports.handle = async ({ Records: records }) => {
  try {
    await Promise.all(
      records.map(async (record) => {
        const { key } = record.s3.object;

        const image = await S3.getObject({ Bucket: process.env.bucket, Key: key }).promise();

        // blob
        const optimized = await sharp(image.Body)
          .resize(1280, 720, {
            fit: "inside",
            withoutEnlargement: true,
          })
          .toFormat("jpeg", {
            progressive: true,
            quality: 50,
          })
          .toBuffer();

        await S3.putObject({
          Body: optimized,
          Bucket: process.env.bucket,
          ContentType: "image/jpeg",
          Key: `compressed/${basename(key, extname(key))}.jpg`,
        }).promise();
      })
    );

    return {
      statusCode: 301,
      body: { ok: true },
    };
  } catch (error) {
    return error;
  }
};
person Leonardo Rocha    schedule 01.02.2021

Вместо этого попробуйте WebP, хотя он и не разработан как прогрессивный, но его можно использовать в сочетании с отложенными загрузчиками. Это гораздо лучший формат для сжатия (файл 1mb jpeg может в итоге получиться просто 300kb).

Учти это:

  • 24 КБ заполнитель
  • Ленивая загрузка с эффектом затухания -
  • 300 КБ веб-сайт

Попробуйте пакет webp-loader, который можно использовать в сборках webpack.

person IsleOfManIsAwesome    schedule 01.02.2021