2014-11-17 127 views
3

我有兩個RenderedImages。我想用這兩幅圖像做一個Overlay Operation,因此它們需要匹配數據類型和波段數。
我的問題是一個圖像有3個波段(RGB),第二個圖像有4個波段(ARGB)。JAI將Alpha通道添加到RenderedImage

我的問題是如何添加一個Alpha通道到第一個圖像,所以我可以做Overlay Operation

EDIT
好的,我發現添加Alpha通道到所述第一圖像的方法。以下是代碼。我只是創建了一個單獨的帶狀常量圖像,並將其與我的第一張圖像合併。

ParameterBlock pb = new ParameterBlock(); 
pb.add(new Float(finalImage.getWidth())).add(new Float(finalImage.getHeight())); 
pb.add(new Byte[] {new Byte((byte)0xFF)}); 
RenderedImage alpha = JAI.create("constant", pb); 

finalImage = BandMergeDescriptor.create(finalImage, alpha, null); 

現在的問題是,我每次添加覆蓋圖像都會改變顏色。所有的顏色都變成紅色或粉紅色的細微差別。當我添加第二個覆蓋圖時,圖像會再次變爲正常,但第一個覆蓋圖會更改顏色。所有黑色區域都變成白色。

此外,疊加的背景不透明。它是灰色的。

以下是圖像的例子,讓你看到改變顏色如何:

original Picture

after adding the first overlay

after adding the second overlay

正如你可以看到,圖片和疊加改變顏色和疊加的背景不透明。

你能幫我解決這個問題,讓圖像始終顯示正確嗎?謝謝!

回答

0

您可以嘗試使用ARGB模型創建一個新的BufferedImage,並將不透明的背景圖片繪製到此新的BufferedImage中。然後你有一個帶alpha通道的BufferedImage(儘管所有的像素都是不透明的),所以Composition應該有希望工作。

+0

這沒有奏效。圖像不斷變化的顏色。 – adryr

+0

也沒有應用你的參數塊?只需將未改變的第一張圖像繪製成新的乾淨的緩衝圖像? – cello

+0

是的,我創建了一個'TYPE_4BYTE_ARGB'類型的'BufferedImage',並在其中繪製了第一個圖像。 'img.createGraphics()。drawRenderedImage(finalImage,new AffineTransform());' – adryr

0

我不知道TYPE_4BYTE_ARGB,因爲我通常使用TYPE_INT_ARGB的BufferedImages,但我經常使用將RGB BufferedImage繪製到新的ARGB BufferedImage然後將其繪製到其他東西上而沒有問題的方法。顏色的改變意味着在覆蓋過程中正在對其他頻道進行不必要的改變,因爲它似乎並不特定於特定的圖像。如果你的覆蓋操作類似於用alpha來繪製一個圖像到另一個圖像,我可能會建議使用Graphics.drawImage()/ drawRenderedImage()方法來覆蓋本身,更不用說在這種情況下背景甚至不需要alpha。

代碼:

public RenderedImage overlay(RenderedImage back, RenderedImage front, AffineTransform overlayTransformation) 
{ 

    BufferedImage newBack = new BufferedImage(back.getWidth(), back.getHeight(), TYPE_3BYTE_RGB); 
    newBack.setData(back.getData()); 
    Graphics2D graphics = (Graphics2D)(newBack.getGraphics()); 
    graphics.drawRenderedImage(front, overlayTransformation); 
    return newBack; 

} 

您可能希望確保將原先光柵並不雖然修改。