幾行 python 代碼合成 gif / 微信表情~與惡意合成軟件說再見【文末附代碼】


圖片來源:《鬼滅之刃》 op 截屏

gif 格式的圖片不但自帶“能動”屬性,還可作爲“表情”被收入微信表情包。隨手製作 gif 表情包可以算得上是當代沙雕青年的必備技能之一了。

製作 gif 比較流行的方法是:下載一個專門生成表情包的軟件、訪問一個在線轉換的網站並按順序上傳圖片或使用 Photoshop 裏面的“時間軸”面板。

但只是爲了將幾張圖片“捏”在一起,產生一個能動的效果,上述方法其實都有些大材小用,並且還不是很方便。

如果不是需要很好的壓縮算法,我們完全可以在自己的計算機上輕量、快捷地完成“一鍵式”轉換,因此我們僅需要代碼幫我們完成:

  • 讀取現有圖片到內存;

  • 整理內存中的圖片信息,符合 gif 格式規範;

  • 輸出 gif 圖片。

python 豐富的生態爲我們提供了一個很方便的解決方案:

  • imageio.imread() 將圖片保存爲 RGB 點陣於內存中;

  • imageio.mimsave(gif_path, frames, ‘GIF’, duration) 將 frames 中的點陣對象整合,輸出 gif 文件到硬盤上。

我對其稍加整理如下:

if __name__ == "__main__":
    # path init
    path = os.path.join(__file__, "..")
    # read pngs
    file_list = os.listdir(path)
    png_list = file_list.copy()
    for file in file_list:
        if file[-4:]!=".png":
            png_list.remove(file)
    png_list.sort(key=lambda x: int(x[:-4]))
    # now all the pngs are in the png_list
    # and sorted well from min to max
    # turn pngs into a gif file
    frames = []
    for png in png_list:
        # get the png file's path
        image_path = os.path.join(path, png)
        # imageio.imread() to get RGB matrix
        # frames is a list which stores the pngs in order
        frames.append(imageio.imread(image_path))
    # production path
    gif_path = os.path.join(path, "my_gif.gif")
    imageio.mimsave(gif_path, frames, 'GIF', duration=DURATION)
    print("done")
    pass

怎麼使用呢?

  • 首先,建一個空的文件夾,把你的 png 圖片保存在其中;
  • png 圖片命名要以數字命名,順序越前的圖片數字越小;
  • 該文件夾內,新建一個 python file ,保存上述代碼於其中;
  • 依靠編輯器或命令行運行這個 .py!
  • 你將看到 my_gif.gif 文件已經出現在你的文件夾中了。


很多時候,由於 gif 多了“時間”這個維度,圖片的順序、創意、內容等多種元素組合在一起,可以帶來比一張圖片好很多的效果。比如,可以給女朋友做一套“相冊”,這可比修圖浪漫多了:

還可以給公衆號製作個粗糙的頭圖:

值得注意的是,如果你想使用上述方案,圖片大小盡量保持一致。

感謝閱讀,公衆號:Piper蛋窩。

可以訪問我的倉庫(閱讀原文):
https://github.com/PiperLiu/interesting-python3/tree/master/visual-python/imageio2gif

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章