Как узнать черно-белое изображение или нет?

Есть множество изображений (почти 9млн.) и цветные и черно-белые, все вперемешку и различных форматов (png, jpg, jpeg).

Я их сжимаю через библиотеку sharp, примерно следующим образом:

const sharp = require('sharp'); // Подключаем библиотеку

try {
  const { data } = await sharp('image.png', { animated: true }).toBuffer({ resolveWithObject: true }); //? выдаст ошибку если картинка багованная и уйдёт в блок catch()

  try { //* Если изображение БЕЗ багов, то обрабатываем его
    const imageBuffer = new Uint8ClampedArray(data.buffer)
    await sharp(imageBuffer)
      .webp({ quality: 82, reductionEffort: 6, smartSubsample: true, })
      .toFile('outImage.webp')
  } catch (error) {
    // Ошибка конвертации
  }
} catch (err) {
  // Попадём сюда если картинка дефектная
}

Вопрос: как определить черно-белое изображение или нет?

Пробовал через эту же библиотеку, через метаданные, типа так:

const metadata = await sharp('image.png').metadata();
console.log('metadata =>', metadata)
// metadata => 
// {
//   format: 'jpeg', // и да, формат изображения в метаданных может отличаться от расширения
//   width: 2000,
//   height: 2871,
//   space: 'b-w', // srgb, rgb, cmyk, lab, b-w пространство, в этом случае черно-белое
//   channels: 1, // кол-во каналов
//   depth: 'uchar',
//   density: 72,
//   chromaSubsampling: '4:4:4',
//   isProgressive: true,
//   hasProfile: false,
// }

Казалось бы, всё прекрасно, берём (metadata.space === 'b-w') или (metadata.channels === 1) и радуемся, но бывают черно-белые изображения к примеру (metadata.space === 'rgb') и (metadata.channels === 3), а как быть в этом случае? =)) До этого, с изображениями работать не приходилось, поэтому как быть ума не приложу.

PS: Если кому-то интересно, цветность картинок я хочу определять, для того, что бы черно-белые сжимать с другими параметрами качества, т.е. сильнее, так как цветные изображения при сжатии сильнее покрываются "артефактами" (визуально), в отличии от ч/б.


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