如何获取图像(在文件中)通道数(颜色深度)?
How to get image's (in a file) number of channels (color depth)?
这里有一个很好的例子,说明如何从文件中获取图像的尺寸:
该方法使用 ImageReader
,如果不需要,它会尽量不读取整个图像。
有没有类似的方法获取图像的颜色深度,彩色图像为3,b/w图像为1?
我发现这可能是ImageReader#getRawImageType(int)
方法。这是正确的方法吗?
是的,
您可以使用 imageReader.getRawImageType(imageNo)
。这种方法在大多数情况下都有效。不幸的是,它在某些情况下会 return 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 documentation and IIOMetadataNode
API doc 了解更多信息。
我花了一些时间来解决这个问题,并希望与他人分享。它是 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
这里有一个很好的例子,说明如何从文件中获取图像的尺寸:
该方法使用 ImageReader
,如果不需要,它会尽量不读取整个图像。
有没有类似的方法获取图像的颜色深度,彩色图像为3,b/w图像为1?
我发现这可能是ImageReader#getRawImageType(int)
方法。这是正确的方法吗?
是的,
您可以使用 imageReader.getRawImageType(imageNo)
。这种方法在大多数情况下都有效。不幸的是,它在某些情况下会 return 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 documentation and IIOMetadataNode
API doc 了解更多信息。
我花了一些时间来解决这个问题,并希望与他人分享。它是 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