SampleModel.getPixel()(由Raster.getPixel()内部使用)以band的顺序返回像素分量.虽然可以使用与RGB不同的波段顺序以编程方式创建SampleModel的伪实例,但通常SampleModel的实例由某些ColorModel创建,该ColorModel使用与ColorModel中颜色分量的顺序相同的顺序构造SampleModel. .
The number, order, and interpretation of color components for a ColorModel is specified by its ColorSpace.
理论上,您应该检查颜色空间是否来自RGB系列:
public static void processImage( BufferedImage source )
{
ColorSpace colorSpace = source.getColorModel().getColorSpace();
if ( dumpColorSpaceProperties ) {
System.out.printf( "color space type: %d, is RGB = %s%n", colorSpace.getType(), colorSpace.isCS_sRGB() );
for ( int i = 0; i < colorSpace.getNumComponents(); i++ ) {
System.out.printf( "component %d = %s%n", i, colorSpace.getName( i ) );
}
}
if ( colorSpace.getType() == ColorSpace.TYPE_RGB ) {
// guaranteed RGB(A) order, proceed with raster.getPixels()
} else {
// well, find a way to convert from that space into RGB
throw new AssertionError( "color space type = " + colorSpace.getType() );
}
}
在实践中,这一切都取决于图像的来源.通过BufferedImage(width,height,imageType)创建的图像始终使用RGB空间.如果图像文件格式支持不同的颜色空间并且该特定图像文件使用非RGB空间,则从文件获得的图像可以使用一些其他颜色空间.
如果您知道图像源,则无需检查色彩空间,并且可以假设Raster.getPixels()的RGB(A)输出.
ColorSpace.getName(int)源提供了对实际可能遇到的大多数颜色集的默认组件的深入了解.