Как узнать черно-белое изображение или нет?
Есть множество изображений (почти 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: Если кому-то интересно, цветность картинок я хочу определять, для того, что бы черно-белые сжимать с другими параметрами качества, т.е. сильнее, так как цветные изображения при сжатии сильнее покрываются "артефактами" (визуально), в отличии от ч/б.