2014-05-06 38 views
3

我已經寫了複製像素數據轉換整數數組這樣的圖像處理代碼:Raster.getPixels()返回的像素分量的順序是什麼?

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; 
} 

的代碼可與到目前爲止我測試的圖像。 pixelRow陣列對於帶有3個波段(無alpha通道)的圖像,以及對於帶有4個波段(帶有alpha通道)的圖像,紅,綠,藍和Alpha的順序似乎總是以紅,綠和藍的順序接收像素分量。

但是,我找不到任何描述說明這一點。是否保證我會一直按照這個順序獲取像素組件?有沒有描述這個的規範?

回答

7

SampleModel.getPixel()(在Raster.getPixel()的內部使用)按波段順序返回像素分量。雖然有可能通過編程方式創建一個僞造實例,其帶區順序與RGB不同,但通常情況下,SampleModel的實例由某個ColorModel創建,它構造了SampleModel,帶區的順序與顏色順序相同。 ColorModel

顏色模型分量的順序記錄在java.awt.image.ColorModel javadoc

數量,順序和用於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()); 
    } 
} 

在實踐中這一切都取決於圖像的來源。通過BufferedImage(width, height, imageType)創建的圖像始終使用RGB空間。如果圖像文件格式支持不同的色彩空間,並且該特定的圖像文件使用非RGB空間,則從文件獲取的圖像可以使用其他色彩空間。

如果您知道圖像源,則不需要檢查色彩空間,並且可以假設Raster.getPixels()的RGB(A)輸出。

ColorSpace.getName(int)來源提供了對實踐中可能遇到的大多數顏色集的默認組件的深入瞭解。

+0

非常感謝您的回答。這看起來非常好。對於CMYK JPEG圖像,我在調用getPixels()的圖像處理代碼之前將顏色空間轉換爲RGB。這完全適合。 – Codo

1

A Raster object包含一個SampleModel。 SampleModel描述了柵格對象內的像素佈局。

這裏有一些鏈接:

+0

感謝您的鏈接。這兩個類提供了很多信息,例如無論顏色是否存儲在不同的平面中,使用的是哪種數據類型。這主要是我不需要關心的信息,因爲* getPixels()*方便地將顏色組件解包爲易於使用的數組。但是,我無法弄清楚什麼方法可以給我更多關於顏色分量順序的信息。你可以說得更詳細點嗎? – Codo

0

本文PNG Specification似乎表明,你的順序描述,其實標準。 3.1.44節意味着同樣多。然而,在涉及顏色的其他情況下,似乎通常是[alpha,]紅色,綠色,藍色,如Microsoft here.所述。由於java.awt.image包中的幾個方法使用或返回類似的樣本數組,它應該假設這個訂單是標準的,這是非常安全的。儘管如此,我無法找到指定此行爲的一個實例。

+0

感謝您的回答。不過,我特別感興趣的是Java * Raster.getPixels()*的輸出,而不是如何將它存儲在PNG文件中或在.NET中處理。 – Codo

0

我還沒有確定的答案。但相關信息更可能在ColorModel實例中找到(而不是在Raster或SampleModel實例中)。

ColorModel實例可以從BufferedImage直接訪問。

相關問題