2011-11-08 32 views
1

我正在使用JAI爲圖像添加「邊框」。例如使用JAI,如何向調色板添加新顏色?

ParameterBlock pb = new ParameterBlock(); 
pb.addSource(r); 
pb.add(leftPad); 
pb.add(rightPad); 
pb.add(topPad); 
pb.add(bottomPad); 

pb.add(new BorderExtenderConstant(consts)); 

r = JAI.create("border", pb); 

上面的'consts'的值取決於ColorModel。當使用ComponentColorModel時,每個像素都有自己的顏色,所以我不必亂用調色板。當圖像具有調色板(GIF,PNG,...)時,ColorModel爲IndexColorModel。

當使用IndexColorModel時,'consts'是一個double []數組,大小爲1。數組中的值是調色板中的索引。

我發現瞭如何通過創建一個新的IndexColorModel來修改調色板,但是我必須編寫的邏輯將是瘋狂的! (例如,調色板中可以有多少種顏色取決於許多因素,另外,如果我需要從調色板中刪除顏色以添加新顏色,則需要確定哪種顏色最適合去除的邏輯,以及然後修改之前引用該顏色的所有像素 - 哇,這是很多代碼!)

所以,我的問題是,如何爲調色板添加顏色?是否有現有的圖書館?或者我應該使用ioimage的東西? (老實說,我有點困惑,在哪裏「結束」和ioimage「開始」)

另外,側面的問題,由於某種原因,我的測試圖像,只有約10顏色的調色板讀入有256種顏色。當我用jai保存圖像時,所有的256種顏色都被保存(11到255都是黑色的)。任何想法爲什麼這樣做?

謝謝! David

回答

0

我已經能夠想出上述問題的最佳解決方案是將圖像從IndexColorModel轉換爲ComponentColorModel。 (一ComponentColorModel的每個像素指定其自身的顏色,所以沒有托盤你一起工作 - 你可以很容易地使用任何你想要的顏色。)

我凸輪了這個簡單的解決方案閱讀http://java.sun.com/products/java-media/jai/forDevelopers/jaifaq.html#palette

後這是我在看過一張圖片之後所做的事情:

if(image.getColorModel() instanceof IndexColorModel) { 
    IndexColorModel icm = (IndexColorModel)image.getColorModel(); 
    byte[][] data = new byte[4][icm.getMapSize()]; 

    icm.getReds(data[0]); 
    icm.getGreens(data[1]); 
    icm.getBlues(data[2]); 
    icm.getAlphas(data[3]); 

    LookupTableJAI lut = new LookupTableJAI(data); 

    image = JAI.create("lookup", image, lut); 
} 

一旦完成了操作,您可以將圖像轉換回來。我沒有花時間弄清楚。如果有人想弄明白,你可能想讀這個:http://www.java.net/node/675577