校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > Python生成截圖選餐GIF動畫

Python生成截圖選餐GIF動畫

熱門標簽:百應電話機器人總部 地圖標注與注銷 旅游廁所地圖標注怎么弄 南昌地圖標注 宿州電話機器人哪家好 電梯新時達系統外呼顯示e 西青語音電銷機器人哪家好 成都呼叫中心外呼系統哪家強 無錫智能外呼系統好用嗎

之前群里有小伙伴問今天中午該吃什么,然后另一位小伙伴發了一張下面的動圖:

我個人覺得還挺有意思的,截圖還真像抽獎一樣隨機選一個菜名。考慮到這張動圖中的菜名候選并不見得都是我們能夠吃的菜。我們可以用python根據菜名列表生成這樣的動圖玩玩。

之前還看到什么截圖選頭像之類的動圖,那類通過圖片生成的動圖都比較簡單,通過文中提到的Imagine的動畫作坊工具就可以做。所以本文只演示如何生成文字動圖。

python生成文字動圖

下面我們一步步來完成這個操作:

下載表情圖片到本地

為了分析這種表情圖片,第一步需要先下載下來,但是對于微信的表情動圖,經過測試還真沒法直接下載下來。

雖然通過文件監控工具分析出,gif表情動圖存儲位置在C:\Users\ASUS\Documents\WeChat Files\你的微信ID\FileStorage\CustomEmotion\xx\xxxx位置,但是卻無法用圖片工具查看。用winhex分析二進制得到了V1MMWX這樣的文件頭,說明微信對表情都進行了一定程度的加密。雖然可以解密,但這樣大動干戈未免過于麻煩。

后面終于想到了一個簡單的方案,那就是把向你有權限登錄后臺的公眾號發送這個表情,再去公眾號后臺下載:

微信發送的動圖都是存儲為自己特有V1MMWX加密格式,可能是為了使用自己獨創的壓縮算法有更大的壓縮比吧。那說明我們想直接看本地微信存儲的gif動圖,只能自行開發專門針對這種微信格式的解碼器了。

分析動圖

下面我使用小工具Imagine,并使用動畫作坊打開:

可以看到這張動圖由22張文字圖片組成,幀切換時間為20毫秒。

生成單張圖片

分析完成我們考慮用PIL庫來生成單張圖片,如果還沒有安裝該庫的童鞋,使用以下命令安裝該庫:

pip install pillow

下面選擇了用藍底做背景。我們先來繪制中間的菜名文字:

from PIL import Image, ImageFont, ImageDraw


text = "珍珠土豆燜牛腩"
size = 320
fontsize = (size-20)//len(text)
im = Image.new(mode='RGB', size=(size, size), color="lightblue")

draw = ImageDraw.Draw(im=im)
draw.text(xy=(10, (size-fontsize*1.5)/2),
          text=text, fill=0,
          font=ImageFont.truetype('msyh.ttc', size=fontsize))
im

由于菜品的名字文字個數不一致,為了都能填滿整圖,作了自動文字大小調整處理。

字體我選擇了微軟雅黑,當然微軟雅黑也有三種子字體,可以通過系統字體安裝目錄查看字體文件的屬性從而知道字體對應的文件名:

下方帶陰影的的文字生成起來會麻煩一些,我的思路是先繪制純黑的文字,在繪制帶黑色邊緣白色填充的文字向上偏移幾個單位:

def text_border(text, x, y, font, shadowcolor, fillcolor):
    draw.text((x - 1, y), text, font=font, fill=shadowcolor)
    draw.text((x + 1, y), text, font=font, fill=shadowcolor)
    draw.text((x, y - 1), text, font=font, fill=shadowcolor)
    draw.text((x, y + 1), text, font=font, fill=shadowcolor)

    draw.text((x - 1, y - 1), text, font=font, fill=shadowcolor)
    draw.text((x + 1, y - 1), text, font=font, fill=shadowcolor)
    draw.text((x - 1, y + 1), text, font=font, fill=shadowcolor)
    draw.text((x + 1, y + 1), text, font=font, fill=shadowcolor)

    draw.text((x, y), text, font=font, fill=fillcolor)


bottomtext = "不知道吃什么?截圖吃飯"
bottom_fontsize = 27
bottom_font = ImageFont.truetype('STHUPO.TTF', size=bottom_fontsize)
x, y = (size-bottom_fontsize*len(bottomtext))/2, size-bottom_fontsize*1.2
draw.text(xy=(x, y), text=bottomtext,
          fill=0, font=bottom_font)
text_border(bottomtext, x, y-4,
            bottom_font, 0, (255, 255, 255))
im

上述代碼選擇了華文琥珀作為字體,個人用來繪制文字邊框的方法比較簡單粗暴,如果有更好的辦法,歡迎留言交流。

考慮到后續圖片發送到微信上顯示都很小,干脆現在就壓縮一下像素大小:

im.thumbnail((128, 128))
im

下面我們封裝一下生成代碼,方便后續調用:

from PIL import Image, ImageFont, ImageDraw


def text_img(text, bgcolor="lightblue", bottomtext="不知道吃什么?截圖吃飯", size=360, result_size=(128, 128)):
    def text_border(text, x, y, font, shadowcolor, fillcolor):
        draw.text((x - 1, y), text, font=font, fill=shadowcolor)
        draw.text((x + 1, y), text, font=font, fill=shadowcolor)
        draw.text((x, y - 1), text, font=font, fill=shadowcolor)
        draw.text((x, y + 1), text, font=font, fill=shadowcolor)

        draw.text((x - 1, y - 1), text, font=font, fill=shadowcolor)
        draw.text((x + 1, y - 1), text, font=font, fill=shadowcolor)
        draw.text((x - 1, y + 1), text, font=font, fill=shadowcolor)
        draw.text((x + 1, y + 1), text, font=font, fill=shadowcolor)

        draw.text((x, y), text, font=font, fill=fillcolor)

    im = Image.new(mode='RGB', size=(size, size), color=bgcolor)
    draw = ImageDraw.Draw(im=im)
    fontsize = (size-20)//len(text)
    draw.text(xy=(10, (size-fontsize*1.5)/2),
              text=text, fill=0,
              font=ImageFont.truetype('msyh.ttc', size=fontsize))
    bottom_fontsize = (size-20)//len(bottomtext)
    bottom_font = ImageFont.truetype('STHUPO.TTF', size=bottom_fontsize)
    x, y = (size-bottom_fontsize*len(bottomtext))/2, size-bottom_fontsize*1.2
    draw.text(xy=(x, y), text=bottomtext,
              fill=0, font=bottom_font)
    text_border(bottomtext, x, y-4,
                bottom_font, 0, (255, 255, 255))
    im.thumbnail(result_size)
    return im

測試一下:

text_img("魚香茄子")

ok,現在我們就已經能夠給任何菜品生成圖片了。但是菜品的名字哪里來呢?我找到了一個網站,下面考慮爬一下它:

爬取菜品數據

網址是:https://m.meishij.net/caipu/

這個網站結果非常簡單,一個簡單的xpath即可獲取到所有的菜品名稱:

下面開始下載:

from lxml import etree
import requests

req = requests.get("https://m.meishij.net/caipu/")

html = etree.HTML(req.text)
menu = html.xpath("http://dl[@class='recipe_list']//a/text()")
menu = list(set([_.strip(".") for _ in menu]))
print(len(menu), menu[:10], menu[-10:])

3744 ['排骨藕湯', '芋圓', '海鮮湯', '涼拌杏鮑菇', '三汁燜鍋', '奶香玉米汁', '炒豆角', '茄子醬', '芒果糯米糍', '饅頭'] ['清蒸茄子', '西蘭花炒雞', '老式蛋糕', '排骨年糕', '清炒絲瓜', '芋頭蒸排骨', '木耳炒肉', '蠔油油麥菜', '麻辣雞塊', '荷葉餅']

有了這些菜名,我們已經可以用來生成動圖了。不過為了以后還能夠學做菜,我們可以將菜名保存起來,要學做菜的時候呢打開網頁:https://so.meishi.cc/?q=菜名,進行搜索。

保存菜名:

with open("meau.csv", "w", encoding="u8") as f:
    f.write("菜名\n")
    for row in menu:
        f.write(row)
        f.write("\n")

下面我們開始生成菜名動圖:

生成菜名動圖

3767多個菜名畢竟是太多,我們可以隨意取30個菜名來生成動圖:

import random

gif_list = random.choices(menu, k=30)
print(gif_list)

['蒸水蛋', '肉桂卷', '涼瓜炒蛋', '芝士焗紅薯', '香蕉酥', '酸奶慕斯', '雞蛋腸粉', '紅油肚絲', '玉米雞蛋餅', '酸辣豆腐湯', '蘿卜燉牛腩', '苦瓜排骨湯', '腐竹拌芹菜', '西紅柿炒土', '蒜蓉蒸茄子', '豆沙面包', '蘑菇炒肉', '清炒蓮藕', '黑椒牛肉粒', '南瓜煎餅', '炒黃瓜', '雜糧饅頭', '桃山皮月餅', '蔥爆肉', '小炒牛肉', '豆瓣鯽魚', '蝦仁燴豆腐', '素餡餃子', '涼拌黃瓜', '砂鍋魚頭']

PS:還是自己選好菜名,寫死列表更好😅

import imageio

frames = [text_img(text) for text in gif_list]
imageio.mimsave("meau.gif", frames, 'GIF', duration=0.02)

生成結果:

根據菜名列表生成動圖的完整代碼

import imageio
from PIL import Image, ImageFont, ImageDraw


def text_img(text, bgcolor="lightblue", bottomtext="不知道吃什么?截圖吃飯", size=360, result_size=(128, 128)):
    def text_border(text, x, y, font, shadowcolor, fillcolor):
        draw.text((x - 1, y), text, font=font, fill=shadowcolor)
        draw.text((x + 1, y), text, font=font, fill=shadowcolor)
        draw.text((x, y - 1), text, font=font, fill=shadowcolor)
        draw.text((x, y + 1), text, font=font, fill=shadowcolor)

        draw.text((x - 1, y - 1), text, font=font, fill=shadowcolor)
        draw.text((x + 1, y - 1), text, font=font, fill=shadowcolor)
        draw.text((x - 1, y + 1), text, font=font, fill=shadowcolor)
        draw.text((x + 1, y + 1), text, font=font, fill=shadowcolor)

        draw.text((x, y), text, font=font, fill=fillcolor)

    im = Image.new(mode='RGB', size=(size, size), color=bgcolor)
    draw = ImageDraw.Draw(im=im)
    fontsize = (size-20)//len(text)
    draw.text(xy=(10, (size-fontsize*1.5)/2),
              text=text, fill=0,
              font=ImageFont.truetype('msyh.ttc', size=fontsize))
    bottom_fontsize = (size-20)//len(bottomtext)
    bottom_font = ImageFont.truetype('STHUPO.TTF', size=bottom_fontsize)
    x, y = (size-bottom_fontsize*len(bottomtext))/2, size-bottom_fontsize*1.2
    draw.text(xy=(x, y), text=bottomtext,
              fill=0, font=bottom_font)
    text_border(bottomtext, x, y-4,
                bottom_font, 0, (255, 255, 255))
    im.thumbnail(result_size)
    return im


def save_meau_gif(savename, meau):
    frames = [text_img(text) for text in meau]
    imageio.mimsave(savename, frames, 'GIF', duration=0.02)

使用示例:

meau = [
    "荷葉糯米雞", "烤羊肉", "黑椒牛排", "家常大盤雞", "蒜泥豆角",
    "洋蔥炒牛肉", "絲瓜炒雞蛋", "平菇炒雞蛋", "雞刨豆腐", "芙蓉鮮蔬湯",
    "炒西葫蘆", "茄子豆角", "滑蛋牛肉", "香菇青菜", "地三鮮",
    "醬燒杏鮑菇", "腐乳雞翅", "醋溜藕片", "椰子燉雞", "香菇燒豆腐",
    "咖喱雞腿飯", "雞汁土豆泥", "茄子燉土豆", "炒烏冬面", "咖喱土豆雞",
    "上湯娃娃菜", "蒜蓉蒸茄子", "芝士焗紅薯", "栗子黃燜雞", "絲瓜豆腐湯",
]
save_meau_gif("meau.gif", meau)

生成結果:

自從我們的動圖就生成完畢啦!不知道吃啥的時候都可以拿出來截圖玩玩~🐶

😆祝大家選餐愉快~

PIL操作gif的其他操作

其實用專門動圖處理軟件就可以操作,下面還是補充一下,python的操作API記錄一下:

Gif拆分

比如我們拆分一下這張圖:

from PIL import Image, ImageSequence

img = Image.open('功夫熊.gif')
for i, f in enumerate(ImageSequence.Iterator(img), 1):
    f.save(f'拆分/功夫熊-{i}.png')

拆分結果:

GIF倒放

下面我們再將上面這張動圖倒放一下:

from PIL import Image, ImageSequence
import imageio

im = Image.open('功夫熊.gif')
sequence = [f.copy() for f in ImageSequence.Iterator(im)]
sequence.reverse()  # 將列表中的幀通過reverse()函數進行倒序
sequence[0].save('倒放功夫熊.gif', save_all=True, append_images=sequence[1:])

到此這篇關于Python生成截圖選餐GIF動畫的文章就介紹到這了,更多相關Python生成截圖GIF動畫內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Python中matplotlib如何改變畫圖的字體
  • Python制作動態字符畫的源碼
  • 教你如何利用python3爬蟲爬取漫畫島-非人哉漫畫
  • 教你用Python爬取英雄聯盟皮膚原畫
  • 如何用Python畫一些簡單形狀你知道嗎

標簽:渭南 濰坊 雅安 許昌 辛集 贛州 七臺河 西安

巨人網絡通訊聲明:本文標題《Python生成截圖選餐GIF動畫》,本文關鍵詞  Python,生成,截圖,選餐,GIF,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python生成截圖選餐GIF動畫》相關的同類信息!
  • 本頁收集關于Python生成截圖選餐GIF動畫的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    欧美视频在线观看一区| 久久精品久久综合| 亚洲精品欧美综合四区| 91在线观看下载| ...av二区三区久久精品| 丁香桃色午夜亚洲一区二区三区| 久久精品一区八戒影视| 色综合久久中文综合久久97| 午夜精品一区在线观看| 国产片一区二区三区| 色哟哟在线观看一区二区三区| 夜夜操天天操亚洲| 亚洲精品一区二区三区四区高清| 北条麻妃国产九九精品视频| 国产麻豆视频一区| 精品黑人一区二区三区久久| 99久久综合狠狠综合久久| 日本中文字幕一区二区视频| 国产日产精品一区| 91精品欧美综合在线观看最新| 国产一区二区精品久久99| 一色桃子久久精品亚洲| 日韩限制级电影在线观看| 99久久亚洲一区二区三区青草| 日本欧美加勒比视频| 国产精品免费丝袜| 日韩欧美一区二区免费| 91日韩一区二区三区| 精油按摩中文字幕久久| 亚洲成人三级小说| 日韩一区在线播放| 欧美v日韩v国产v| 欧美日韩中文国产| av男人天堂一区| 国产在线不卡一卡二卡三卡四卡| 亚洲一卡二卡三卡四卡| 国产精品三级av| 久久奇米777| 精品成人一区二区三区四区| 欧美日韩在线电影| 99v久久综合狠狠综合久久| 国内精品写真在线观看| 蜜臀av一区二区三区| 亚洲成人7777| 亚洲愉拍自拍另类高清精品| 国产精品色眯眯| 国产亚洲综合性久久久影院| 久久人人超碰精品| 久久亚洲综合av| 久久久久久免费网| 91精品婷婷国产综合久久性色| 欧美亚洲日本一区| 在线观看亚洲a| 欧美老肥妇做.爰bbww| 欧美日韩卡一卡二| 91精品欧美一区二区三区综合在| 欧美三级欧美一级| 欧美一级精品在线| 久久久五月婷婷| 欧美激情一区三区| 狠狠色丁香九九婷婷综合五月| 亚洲一区二区精品视频| 天天亚洲美女在线视频| 日韩国产一二三区| 日本不卡的三区四区五区| 免费在线视频一区| 国产成人综合网站| 91视频国产资源| 欧美精品乱码久久久久久| 91精品国产综合久久精品| 日韩一区二区三区视频在线 | 欧美日韩在线观看一区二区 | 欧美经典一区二区三区| 国产精品不卡一区| 亚洲图片有声小说| 日本成人中文字幕| 福利一区二区在线| 欧美日韩国产综合久久 | 久久国产乱子精品免费女| 国产精选一区二区三区| 97久久精品人人做人人爽50路| 91久久一区二区| 日韩欧美在线123| 国产三区在线成人av| 一区二区三区中文字幕电影 | 色婷婷一区二区| 日韩欧美一级精品久久| 国产精品久久久久久久久果冻传媒| 亚洲一区在线观看免费 | 欧美午夜精品电影| xfplay精品久久| 亚洲自拍另类综合| 国产乱色国产精品免费视频| 欧美唯美清纯偷拍| 国产精品色婷婷久久58| 青青草原综合久久大伊人精品优势 | 国产精品美女久久久久久久久 | 成人午夜视频免费看| 中文字幕日本乱码精品影院| 亚洲欧美另类综合偷拍| 卡一卡二国产精品| 在线观看国产日韩| 国产精品超碰97尤物18| 韩国成人福利片在线播放| 欧美性三三影院| 国产精品国产三级国产有无不卡| 蜜臀国产一区二区三区在线播放| 91在线一区二区三区| 久久久99精品久久| 久久成人羞羞网站| 7878成人国产在线观看| 亚洲最大色网站| 99视频在线精品| 久久久久久免费网| 男女性色大片免费观看一区二区| 91久久免费观看| 亚洲三级电影全部在线观看高清| 国产剧情一区二区三区| xf在线a精品一区二区视频网站| 丝袜亚洲另类丝袜在线| 欧美偷拍一区二区| 亚洲在线视频网站| 欧美在线观看一二区| 亚洲综合久久av| 欧美揉bbbbb揉bbbbb| 亚洲成a人片在线不卡一二三区| 91久久精品国产91性色tv| 伊人夜夜躁av伊人久久| 色狠狠桃花综合| 亚洲一区二区三区小说| 欧洲另类一二三四区| 亚洲欧美日韩电影| 91福利区一区二区三区| 亚洲第一搞黄网站| 日韩三级视频中文字幕| 极品少妇一区二区| 国产精品久久毛片a| 91蜜桃传媒精品久久久一区二区| 亚洲欧美日韩一区| 欧美美女直播网站| 美女看a上一区| 久久色视频免费观看| 国产福利精品导航| 国产精品久久久久一区二区三区共| 99久久婷婷国产| 亚洲成人av中文| 久久久综合网站| 99久久99久久精品免费观看| 亚洲精品国产无天堂网2021| 欧美日韩在线综合| 国产一区二区三区av电影| 国产中文字幕一区| 久久人人97超碰com| 91香蕉视频污| 午夜日韩在线观看| 久久精品一区二区三区不卡| 欧美在线视频日韩| 国产一区二区三区精品欧美日韩一区二区三区 | 懂色av一区二区夜夜嗨| 亚洲四区在线观看| 日韩午夜精品视频| 成人av免费在线播放| 亚洲午夜久久久久久久久电影网 | 国产精品国模大尺度视频| 欧美三片在线视频观看| 国产成人h网站| 亚洲国产一区二区a毛片| 久久婷婷综合激情| 欧美日韩日日夜夜| 成人开心网精品视频| 首页国产丝袜综合| 中文字幕在线一区免费| 日韩欧美高清dvd碟片| 99久久精品免费看| 国产精品69久久久久水密桃| 亚洲sss视频在线视频| 亚洲国产激情av| 精品少妇一区二区三区视频免付费 | 色婷婷av一区二区三区之一色屋| 麻豆91在线看| 亚洲观看高清完整版在线观看| 国产欧美日韩在线视频| 欧美一级免费大片| 欧美日韩国产高清一区二区三区 | 99久久精品国产毛片| 美女一区二区视频| 亚洲综合一区二区| 欧美激情一区二区三区在线| 日韩精品一区二区三区四区视频| 欧洲国产伦久久久久久久| 国产成人精品一区二区三区四区 | 欧美日本国产一区| 91麻豆.com| 成人黄色片在线观看| 国产一区欧美日韩| 久久av中文字幕片| 日韩精品成人一区二区三区| 一区二区三区免费| 一区二区三区四区不卡在线| 国产精品久久一卡二卡|