在Android平臺下合成Gif

原文首發(fā)于我的個人博客網(wǎng)站,歡迎訪問就轧,轉(zhuǎn)載請注明出處

本文介紹在 Android 平臺下合成 GIF 的方法跌捆,查閱資料的過程中發(fā)現(xiàn)大致有兩種方案亡哄。

  1. 使用 giflen (一個 C 的合成 gif 的庫) 進行 gif 合成。

  2. 使用 java 層的 GifEncoder枣抱、LZWEncoder熔吗、NeuQuant 來進行 gif 合成。

當然二者都是基于 LZW 算法佳晶,簡單測試的結(jié)果是桅狠,速度上差不多,由于對 C 不是很擅長轿秧,因此我選擇了 java 層進行合成的方法中跌,但是兩種方法速度上都是 很慢很慢 ??。

因此本文還將會使用多線程獨立編碼的方法來進行優(yōu)化淤刃,每幀圖片并行編碼晒他,加快合成速度,現(xiàn)在的成果是 600 * 450 的圖片 20 張的話逸贾,時間大約在 12s 左右。

本文相關(guān)源碼在 GitHub - GifMaker

使用 giflen 合成

使用 jni 合成津滞,感興趣的同學可以 google 一下 giflen 這個庫铝侵,這里有一個編譯好的 sojar 文件,以及相關(guān) C 源碼触徐,備份在 GitHub 上咪鲜,有需要的同學可以直接下載使用。經(jīng)過我的簡單嘗試發(fā)現(xiàn)撞鹉,使用 so 合成的速度和 java 合成的速度差不多疟丙,都是慢的要死...

優(yōu)化后的 java 合成

原始的合成方法,真的慢...特別慢鸟雏,簡直不能忍享郊。

原始的合成方法是將每一個 Bitmap 使用 LZWEncoder 進行編碼,由于是一個串行的邏輯孝鹊,后面的圖片需要等待前面的編碼完成才可以繼續(xù)下一張編碼炊琉,優(yōu)化后的邏輯是啟動一個線程池,每張圖片獨立編碼又活,最后在所有圖片編碼完成之后輸出流合并苔咪,輸出到文件中,就完成了 gif 的合成柳骄。

缺點:大量的 Bitmap 持有在內(nèi)存中并行編碼团赏,可能會 OOM,不過我測試 20 張 450 * 600 的圖片耐薯,暫時沒有出現(xiàn)問題舔清。合成的圖片要求寬高應該是一樣的隘世,當然使用寬高不一致的圖片也不會有問題,但是會優(yōu)先使用第一張的圖片的寬高作為 gif 的寬高鸠踪,出來的圖片就有些尷尬丙者,因此圖片的轉(zhuǎn)換和處理需要在外面完成。

簡單演示

private void composeGif(List<Bitmap> bitmaps) {
    String absolutePath = new File(Environment.getExternalStorageDirectory()
            , System.currentTimeMillis() + ".gif").getAbsolutePath();
    new GifMaker(100, mExecutorService)
            .makeGifInThread(bitmaps, absolutePath, new GifMaker.OnGifMakerListener() {
                @Override
                public void onMakeGifSucceed(String outPath) {
                    if (!isFinishing()) {
                        GlideUtils.with(mActivity, outPath).into(mImageView);
                    }
                }
            });
}

看一下輸出的結(jié)果营密,20 張大約維持在 12s 左右

I/GifMaker: 完成第10幀,耗時:9.594 s - bitmap [600,450]
I/GifMaker: 完成第11幀,耗時:9.774 s - bitmap [600,450]
I/GifMaker: 完成第18幀,耗時:9.880 s - bitmap [450,600]
I/GifMaker: 完成第9幀,耗時:10.41 s - bitmap [600,450]
I/GifMaker: 完成第17幀,耗時:10.145 s - bitmap [450,600]
I/GifMaker: 完成第16幀,耗時:10.331 s - bitmap [450,600]
I/GifMaker: 完成第6幀,耗時:10.586 s - bitmap [450,600]
I/GifMaker: 完成第5幀,耗時:10.557 s - bitmap [450,600]
I/GifMaker: 完成第8幀,耗時:10.701 s - bitmap [450,600]
I/GifMaker: 完成第15幀,耗時:10.715 s - bitmap [450,600]
I/GifMaker: 完成第4幀,耗時:10.736 s - bitmap [450,600]
I/GifMaker: 完成第1幀,耗時:10.835 s - bitmap [450,600]
I/GifMaker: 完成第19幀,耗時:10.842 s - bitmap [450,600]
I/GifMaker: 完成第13幀,耗時:10.940 s - bitmap [450,600]
I/GifMaker: 完成第0幀,耗時:10.944 s - bitmap [450,600]
I/GifMaker: 完成第14幀,耗時:10.967 s - bitmap [450,600]
I/GifMaker: 完成第3幀,耗時:10.989 s - bitmap [450,600]
I/GifMaker: 完成第12幀,耗時:10.994 s - bitmap [450,600]
I/GifMaker: 完成第2幀,耗時:10.994 s - bitmap [450,600]
I/GifMaker: 完成第7幀,耗時:11.148 s - bitmap [450,600]
I/GifMaker: 合成完成,耗時:11.167 s
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末械媒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子评汰,更是在濱河造成了極大的恐慌纷捞,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件被去,死亡現(xiàn)場離奇詭異主儡,居然都是意外死亡,警方通過查閱死者的電腦和手機惨缆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進店門糜值,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坯墨,你說我怎么就攤上這事寂汇。” “怎么了捣染?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵骄瓣,是天一觀的道長。 經(jīng)常有香客問我耍攘,道長榕栏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任蕾各,我火速辦了婚禮扒磁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘示损。我一直安慰自己渗磅,他們只是感情好,可當我...
    茶點故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布检访。 她就那樣靜靜地躺著始鱼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脆贵。 梳的紋絲不亂的頭發(fā)上医清,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機與錄音卖氨,去河邊找鬼会烙。 笑死负懦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的柏腻。 我是一名探鬼主播纸厉,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼五嫂!你這毒婦竟也來了颗品?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沃缘,失蹤者是張志新(化名)和其女友劉穎躯枢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體槐臀,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡锄蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了水慨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片得糜。...
    茶點故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖讥巡,靈堂內(nèi)的尸體忽然破棺而出掀亩,到底是詐尸還是另有隱情,我是刑警寧澤欢顷,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站捉蚤,受9級特大地震影響抬驴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缆巧,卻給世界環(huán)境...
    茶點故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一布持、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧陕悬,春花似錦题暖、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拼岳,卻和暖如春枝誊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惜纸。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工叶撒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绝骚,地道東北人。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓祠够,卻偏偏與公主長得像压汪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子古瓤,可洞房花燭夜當晚...
    茶點故事閱讀 45,515評論 2 359

推薦閱讀更多精彩內(nèi)容