如何获取图像(在文件中)的通道数(颜色深度)?

时间:2015-09-30 10:27:16

标签: java image javax.imageio color-depth

这里有一个关于如何从文件中获取图像尺寸的好例子:https://stackoverflow.com/a/12164026/258483

该方法使用ImageReader,如果不需要,则尝试不读取整个图像。

是否有类似的方法来获取图像的颜色深度,彩色图像为3,黑白图像为1?

我发现它可能是ImageReader#getRawImageType(int)方法。这是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

是,

您可以使用imageReader.getRawImageType(imageNo)。这种方法大部分时间都可以使用。不幸的是,在某些情况下,它会返回null,最明显的是编码为YCbCr(而不是RGB)的JPEG图像,这可能是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
}

您可以查看standard format documentationIIOMetadataNode API doc了解详情。

答案 1 :(得分:0)

花一些时间弄清楚这个问题,并喜欢与他人分享。这是Jruby调用Java方法,但是逻辑是相同的。元数据格式在here中定义。

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