Как получить количество каналов (глубину цвета) изображения (в файле)?

Вот хороший пример того, как получить размеры изображения из файла: https://stackoverflow.com/a/12164026/258483

В этом методе используется ImageReader, который пытается не прочтите изображение целиком, если это не требуется.

Есть ли аналогичный метод для получения глубины цвета изображения, которая составляет 3 для цветного изображения и 1 для черно-белого изображения?

Я обнаружил, что это, вероятно, ImageReader#getRawImageType(int) < / a> метод. Это правильный способ?


person Suzan Cioc    schedule 30.09.2015    source источник


Ответы (2)


Да,

Вы можете использовать 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 doc для получения дополнительной информации.

person Harald K    schedule 30.09.2015

Мне потребовалось некоторое время, чтобы понять это, и я хотел бы поделиться с другими. Это метод 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
person forthefreedom    schedule 14.05.2020