2011-08-06 59 views
2

我有一個程序加載一張spritesheet,在圖紙上創建每個幀的BufferedImages,並將其寫入一個動畫gif。使用Elliot Kroo提供的關於Creating animated GIF with ImageIO?的課程,我能夠成功輸出文件。然而,這個gif沒有完全正確的動畫。我提供的工作表是一個帶有透明背景的.png,因此每個後續幀都放在最後一幀的頂部,通過透明背景顯示差異(Example)。下面是使用GIF作家代碼:從BufferedImages中寫入一個動畫gif

ImageOutputStream output = new FileImageOutputStream(new File(savePath)); 
GifSequenceWriter writer = new GifSequenceWriter(output, data[0].getType(), delay, true); 
for(BufferedImage bi:data) 
{ 
    writer.writeToSequence(bi); 
} 
writer.close(); 
output.close(); 

如果數據是每幀爲BufferedImage的陣列(我也檢查,似乎並不成爲問題)。這是.gifs還是Java ImageWriters的限制?或者我可以在某處編輯一個設置來防止這種情況發生?如果我不需要,我寧願不放置背景。

回答

2

假設dataBufferedImage一個陣列,所述imageType參數到GifSequenceWriter構造將可能是TYPE_INT_ARGB用於從.png文件中讀取數據。我期望transparentColorFlagtrue,但您必須憑經驗確定transparentColorIndex

graphicsControlExtensionNode.setAttribute("transparentColorFlag", "TRUE"); 
graphicsControlExtensionNode.setAttribute("transparentColorIndex", ???); 

另請參閱此answer

+0

啊。有沒有辦法編輯gifwriter的行爲不使用優化的框架?此外,透明背景的顏色似乎是黑色(0,0,0),但爲transparentColorIndex傳遞0似乎不會影響任何內容(即使正常黑色也不會消失)。 –

+0

據我所知不是。 Kroo的代碼似乎假設不透明的圖像。 '.gif'缺少一個alpha通道;它只有一個顏色索引被認爲是透明的。如果你需要保留'.png'透明,你可以試試['AnimatedGifEncoder'](http://www.java2s.com/Code/Java/2D-Graphics-GUI/AnimatedGifEncoder.htm)。 – trashgod

+0

你知道我應該分配屬性transparentColorIndex嗎?它似乎不是ARGB顏色的整數。 –