我写过图像处理代码,将像素数据复制成整数数组,如下所示:
void processImage(BufferedImage source) {
WritableRaster raster = source.getRaster();
int numBands = raster.getNumBands();
int height = raster.getHeight();
int width = raster.getWidth();
int[] pixelRow = new int[width * numBands];
for (int i = 0; i < height; i++) {
raster.getPixels(raster.getMinX(), raster.getMinY() + i, width, 1, pixelRow);
// do some processing
}
// create a new image
return newImage;
}
Run Code Online (Sandbox Code Playgroud)
该代码适用于我迄今为止测试过的图像.所述pixelRow阵列似乎总是接收的顺序的红,绿和蓝为与3个频带的图像(没有alpha通道)和像素分量的顺序红,绿,蓝和Alpha对于那些4个频带(alpha通道).
但是,我找不到任何说明这一点的说明.是否保证我将始终按顺序获取像素组件?有没有描述这个的规范?
的SampleModel.getPixel()(内部使用由Raster.getPixel()在带的顺序)返回象素分量.虽然可以以SampleModel与RGB不同的波段顺序以编程方式创建虚假实例,但通常SampleModels的实例由一些人创建,这些实例以与颜色分量的顺序相同的顺序ColorModel构造SampleModel带ColorModel.
颜色模型组件的顺序记录在java.awt.image.ColorModel javadoc中:
a的颜色分量的数量,顺序和解释
ColorModel由其指定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() );
}
}
Run Code Online (Sandbox Code Playgroud)
在实践中,这一切都取决于图像的来源.通过BufferedImage(width, height, imageType)始终使用RGB空间创建的图像.如果图像文件格式支持不同的颜色空间并且该特定图像文件使用非RGB空间,则从文件获得的图像可以使用一些其他颜色空间.
如果你知道图像源,你不需要检查颜色空间,你可以假设RGB(A)输出Raster.getPixels().
该ColorSpace.getName(int)源提供了对实际可能遇到的大多数颜色集的默认组件的深入了解.
| 归档时间: |
|
| 查看次数: |
2336 次 |
| 最近记录: |