Преобразование нормального изображения в прогрессивное изображение с использованием Node Js - PullRequest
2 голосов
/ 22 апреля 2019

Есть ли способ написать API, который будет конвертировать нормальное изображение в прогрессивный, используя Nodejs.Я не хочу использовать Base64.Я сделал так много R & D на этом.Одна библиотека, которую я нашел, т.е. lib turbo-jpeg. Но только в этом случае они декодируют изображение. Я тоже хочу кодировать это изображение.Пожалуйста, проверьте эту ссылку ниже для справки.Если у кого-то есть какое-либо решение, пожалуйста, дайте мне знать.

Ссылка - https://github.com/LinusU/cwasm-jpeg-turbo

Пожалуйста, помогите мне написать API для преобразования изображения в формат.

Спасибозаранее.

1 Ответ

1 голос
/ 22 апреля 2019

Вы можете использовать с gm модулем для преобразования поддерживаемых форматов изображений в прогрессивный JPEG.

Вот простой пример (протестирован на macOS с GraphicsMagick v1.3.31 и Node.js v10.15.3):

const fs = require('fs');
const path = require('path');
const https = require('https');

const gm = require('gm'); // https://www.npmjs.com/package/gm

const gmIdentify = gmInstance =>
  new Promise((resolve, reject) => {
    gmInstance.identify((err, data) => {
      if (err) {
        reject(err);
        return;
      }
      resolve(data);
    });
  });

const gmStream = (gmInstance, writeStream, format = 'jpg') =>
  new Promise((resolve, reject) => {
    gmInstance
      .stream(format)
      .pipe(writeStream)
      .once('finish', resolve)
      .once('error', reject);
  });

// This function downloads the file from the specified `url` and writes it to
// the passed `writeStream`.
const fetchFile = (url, writeStream) =>
  new Promise((resolve, reject) => {
    https.get(url, res => {
      if (res.statusCode !== 200) {
        reject(new Error('Something went wrong!'));
        return;
      }

      res
        .pipe(writeStream)
        .once('finish', () => {
          resolve();
        })
        .once('error', err => {
          reject(err);
        });
    });
  });

const main = async () => {
  // Download a sample non-progressive JPEG image from the internet
  const originalJpegUrl =
    'https://upload.wikimedia.org/wikipedia/commons/b/b4/JPEG_example_JPG_RIP_100.jpg';
  const originalPath = path.join(__dirname, './original.jpeg');
  await fetchFile(originalJpegUrl, fs.createWriteStream(originalPath));
  originalJpegData = await gmIdentify(gm(fs.createReadStream(originalPath)));
  console.log(
    `Interlace for the original jpeg file is set to ${
      originalJpegData['Interlace']
    }`,
  );

  // Convert the downloaded file to Progressive-JPEG
  const progressiveJpegPath = path.join(__dirname, 'progressive.jpg');
  await gmStream(
    gm(fs.createReadStream(originalPath))
      .interlace('line' /* or 'plane' */) // https://www.imagemagick.org/MagickStudio/Interlace.html
      .quality(originalJpegData['JPEG-Quality']), // save with the same quality as the original file
    fs.createWriteStream(progressiveJpegPath),
  );
  const progressiveJpegData = await gmIdentify(
    gm(fs.createReadStream(progressiveJpegPath)),
  );
  console.log(
    `Interlace for the converted jpeg file is set to ${
      progressiveJpegData['Interlace']
    }`,
  );
};

main();

Он загружает это непрогрессивное изображение JPEG, преобразует его в прогрессивное изображение JPEG и сохраняет его как progressive.jpg в том же каталоге, что и скрипт.

...