Raster.getPixels()返回的像素组件的顺序是什么?

Cod*_*odo 3 java awt java-2d

我写过图像处理代码,将像素数据复制成整数数组,如下所示:

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通道).

但是,我找不到任何说明这一点的说明.是否保证我将始终按顺序获取像素组件?有没有描述这个的规范?

Ole*_*hin 7

SampleModel.getPixel()(内部使用由Raster.getPixel()在带的顺序)返回象素分量.虽然可以以SampleModel与RGB不同的波段顺序以编程方式创建虚假实例,但通常SampleModels的实例由一些人创建,这些实例以与颜色分量的顺序相同的顺序ColorModel构造SampleModelColorModel.

颜色模型组件的顺序记录在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)源提供了对实际可能遇到的大多数颜色集的默认组件的深入了解.