1. 程式人生 > >java中對gif的第一幀擷取(支援背景透明)

java中對gif的第一幀擷取(支援背景透明)

在某些應用場景下,

可能需要對上傳的gif圖片進行處理,

這個程式碼對原GIF圖片進行了儲存,

並截取了第一幀圖片(支援背景透明)。

</pre><pre code_snippet_id="1610621" snippet_file_name="blog_20160315_6_1788042" name="code" class="java">
<pre name="code" class="java">public void save(){
		try {
			//要操作的圖片
			FileInputStream is=new FileInputStream("E:\\test\\testgif.gif");
			
			//把圖片讀取讀取到記憶體的流
			ByteArrayOutputStream bos=new ByteArrayOutputStream();
			
			//原圖儲存位置
			FileOutputStream fos=new FileOutputStream("E:\\test\\02\\t_01.gif");
			
			byte buffer[]=new byte[1024];
			int leng=0;
			while((leng=is.read(buffer))!=-1){
				fos.write(buffer, 0, leng);
				bos.write(buffer, 0, leng);
			}
			
			
			//擷取第一張圖
			BufferedImage bimage=ImageIO.read(new ByteArrayInputStream(bos.toByteArray(), 0, bos.size()));
			ImageIO.write(bimage, "png", new File("E:\\test\\02\\t_02.png"));
			
			
			is.close();
			fos.close();
			bos.close();
			
		} catch (Exception e) {
			e.printStackTrace();
		}
}


注意點:

1.大部分InputStream只能夠讀取一次,所以需要用 ByteArrayOutputStream將上傳的圖片儲存到記憶體中。

2.ImageIO.read()方法在讀取gif圖片時只會讀取第一張,就是說只能用他來擷取gif的第一幀,而不能通過它來儲存完整的gif。

3.ByteArrayInputStream可以將byte[]轉換為輸入流(InputStream)。

4.部分gif圖片有透明部分,如需要擷取背景透明的第一幀圖片,在ImageIO.write()時,指定格式為png。