Как сжать BMP без потери MIME TYPE и всех заголовков?

У меня есть BMP-файл, в нём есть только чёрный и белый цвета, разрешение 1200 x 500, - обычный текст и баркод.

Как уменьшить размер файла хотя бы до 200кб, без потери MIME TYPE и всех заголовков? Есть какие либо работающие варианты или библиотеки?


Ответы (1 шт):

Автор решения: nörbörnën

Предлагаю воспользоваться библиотекой node-gd

GD graphics library, libgd, C++ bindings for Node.js. With node-gd you can easily create, manipulate, open and save paletted and true color images from and to a variety of image formats including JPEG, PNG, GIF and BMP.

Для демонстрации работы программы я сгенерировал bmp-файл со штрихкодом, его размер равен 2,3M.

const path = require('path');
const gd = require('node-gd');

const filesrc = path.join(__dirname, './EAN13code.bmp');
const filedest = path.join(__dirname, './EAN13code.gd.bmp');

(async () => {
  const img = await gd.openBmp(filesrc);
  img.grayscale();
  img.trueColorToPalette(0, 4);
  await img.saveBmp(filedest, 1);
  img.destroy();
})();

Получился файл размером 60K.


Вся суть сводится к трансформации "широкой" палитры применяемой в файле в "узкую" палитру методом trueColorToPalette и сохранении с компрессией методом saveBmp. Кстати, colorsWanted можно установить значение 2 и тогда картинка получается размером 53K.

→ Ссылка