2011-08-06 80 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颜色的整数。 –