Как получить количество изображений (в файле) каналов (глубина цвета)?
Вот хороший пример того, как получить размеры изображения из файла: /questions/9614127/kak-poluchit-vyisotu-i-shirinu-izobrazheniya-s-pomoschyu-java/9614158#9614158
Метод использует ImageReader
который пытается не прочитать все изображение, если это не требуется.
Существует ли аналогичный метод для получения глубины цвета изображения: 3 для цветного изображения и 1 для ч / б изображения?
Я нашел это, вероятно, ImageReader#getRawImageType(int)
метод. Это правильный путь?
1 ответ
Да,
Ты можешь использовать imageReader.getRawImageType(imageNo)
, Этот метод будет работать большую часть времени. К сожалению, в некоторых случаях он вернется null
Наиболее заметно для изображений JPEG, закодированных как YCbCr (вместо RGB), и это, вероятно, наиболее распространенный случай для JPEG...
Другой способ получить ту же информацию - использовать объект метаданных изображения и посмотреть на стандартный формат метаданных, чтобы получить эту информацию:
IIOMetadata metadata = imageReader.getImageMetadata(imageNo);
if (metadata.isStandardFormatSupported()) { // true for all bundled formats
IIOMetadataNode root = (IIOMetadataNode) imageMetadata.getAsTree("javax_imageio_1.0");
// Get either (as pseudo-xpath):
// /Chroma/NumChannels[@value], which is just number of channels, 3 for RGB
// /Data/BitsPerSample[@value], bits per sample, typically 8,8,8 for 24 bit RGB
}
Вы можете посмотреть документацию стандартного формата и IIOMetadataNode
API документ для получения дополнительной информации.
Мне потребовалось некоторое время, чтобы понять это, и я хотел бы поделиться с другими. Это метод Java вызова Jruby, но логика такая же. Формат метаданных определяется здесь.
iis = ImageIO.createImageInputStream(ByteArrayInputStream.new(document_data.to_java_bytes))
itrs = ImageIO.getImageReaders(iis)
if itrs.has_next
reader = itrs.next
reader.setInput(iis)
metadata = reader.getImageMetadata(0)
if metadata.is_standard_metadata_format_supported
color_depth = metadata.getAsTree('javax_imageio_1.0')
.getElementsByTagName('Chroma').item(0)
.get_elements_by_tag_name('NumChannels').item(0)
.getAttribute('value')
pdf_image.setBlackWhite(true) if color_depth == '1'
end