java中對gif的第一幀擷取(支援背景透明)
阿新 • • 發佈:2019-02-19
在某些應用場景下,
可能需要對上傳的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。