2010-05-06 34 views
0

我需要將加載到BufferedImage的位圖中的顏色從RGB轉換爲YCbCr(亮度和2通道色度)並在處理之後進行轉換。如何使用BufferedImage和YCbCr色彩空間?

我在每個像素的主要方法中用像rgb2ycbcr()這樣的函數做了它,但它並不是那麼聰明的解決方案。我應該使用ColorSpace和ColorModel類以正確的顏色空間獲取BufferedImage。這將是更靈活的方法,但我不知道該怎麼做。

我迷路了,我需要一些提示。有人能幫助我嗎?

回答

2

當我明白你的問題,要做到以下幾點:

負載RGB圖像 - >過程YCbCr圖像 - >使用RGB圖像再次

而且你想讓我們幫助你,使這個過程儘可能無縫。首先,你希望我們給你一個簡單的方法來避免->(轉換)部分。我想看看BufferedImage documentation。看來,好像不存在一種方法來改變曾經創建的BufferedImageColorSpace

您可以使用YCbCr色彩空間創建一個新的BufferedImage,因爲您可以使用預定義的ICC_ColorSpace。然後,您可能會通過ColorSpace.fromRGB將舊圖像中的數據複製到YCbCr色彩空間,進行圖像處理,然後再通過ColorSpace.toRGB進行轉換。此方法要求您在通過現有方法處理之前和之後完全轉換圖像。此外,你必須知道,如何ICC_ColorSpace將您的圖像轉換爲YCbCr色彩空間。否則,您無法知道哪個數組索引對應相同的像素。

如果你只是想創建一個RGB-BufferedImage的包裝,讓你操縱這個圖像,就好像它是一個YCbCr圖像,這是不可能的BufferedImage

編輯: 要轉換BufferedImage使用ColorConvertOp的色彩空間。該守則將是這個樣子:

ColorConvertOp cco = new ColorConvertOp(new YCbCrColorSpace(), null); 
BufferedImage ycbcrImage = cco.filter(oldRGBImage, null); 

這需要您無論是寫自己的ColorSpace類或者你可以下載和使用的類提到here。如果您只想加載JPEG圖像,則應使用predefined classes

+0

但我仍然不知道該怎麼做。我迷路了,我可以找到任何超出文檔類的東西。這與靜態函數非常不同。任何例子? 我正在編寫JPEG算法的實現,我需要轉換爲YCbCr並在分片之前分開通道。現在我正在處理許多數組和函數。這不像我想要的那麼靈活。 – Szopinski 2010-05-06 12:07:27

+0

也許'BufferedImage'類不是你正在尋找的。如果你只是想讓你的程序化Jpeg(de-)編碼器做更多的類OOP嘗試別的東西。一種可能性是爲Jpeg(解除)編碼流水線的每一步創建一個類。 – ablaeul 2010-05-06 19:03:39

+0

好的。從開始:) 我需要打開圖像,分開Y,Cb,Cr通道,並在壓縮之前對每個通道進行分段。 所以我需要BufferedImage與getY(),getCb,getCr()方法或三個與每個通道。怎麼做? – Szopinski 2010-05-07 07:18:30

相關問題