簡體   English   中英

Java:在沒有ImageReader的情況下從動畫GIF獲取幀

[英]Java: get frames from animated GIF without ImageReader

我正在開發AppEngine應用程序。 它的功能之一是將動畫的.gif圖像拆分為單獨的幀。 我進行了很多搜索,以找到方法,最后找到了解決方案。 不幸的是,該解決方案基於ImageReader ,我無法在服務器上使用它,因為:

Google App Engine的Java運行時環境不支持javax.imageio.ImageReader

沒有此類,還有其他方法可以解碼GIF圖像嗎?

您應該使用Images Java API。 您可以在此處找到詳細信息。

首先關於框架本身的一些事情。 將動畫的.gif圖像拆分為單獨的幀有兩個含義。 1)從字面上看,框架是GIF動畫意義上的框架。 問題在於構成動畫GIF圖像的幀是相關的。 動畫GIF的處理方法規定了在繪制當前幀時如何處理前一幀。 您可以覆蓋它; 在繪制新框架之前填充背景色,或者在繪制新框架之前可以做任何您認為合適的事情。 如果您認為上述情況很復雜,框架的透明度如何? 繪制每個框架的邏輯位置?

如果我們沿着這條路走,則無需使用專用的ImageReader,只需讀取圖像的相關部分並復制每個幀數據,然后將其與標題和調色板一起保存即可。 結果是:生成的圖像可能看起來很奇怪且毫無意義。 看下面的例子:

第一幀 框架0

第二幀 框架1

和原來的 原版的

您會看到第二幀看起來不太好。 事實是,第二幀是透明的,它建立在第一幀的頂部(此動畫GIF僅包含2幀)。 您應該看穿第二幀,然后它們一起制作動畫。

現在,讓我們看看將動畫的.gif圖像拆分為單獨的幀的第二個含義。 2)在這種情況下,該幀實際上是一個基於先前幀的合成,這就是我們在查看動畫GIF時看到的內容。 為了實現這一點,我們必須使幀循環的歷史,每個幀的邏輯位置以及幀本身的透明性生效。

讓我們看看我們現在得到了什么:

第一幀 框架0

第二幀 框架1

現在,第一個框架與第一種情況相同,但是第二個框架構造在第一個框架的頂部,並且不再透明。

在第二種情況下,我們必須對幀進行解碼和編碼才能獲得所需的結果。 除了看起來不錯之外,與此有關的另一個好處是,您可以將生成的圖像保存為編碼器支持的任何格式。

這篇文章中的示例是由iCafe的GIF相關部分生成的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM