當(dāng)前位置:首頁 > 公眾號精選 > AI科技大本營
[導(dǎo)讀]作者|?周蘿卜來源|蘿卜大雜燴在當(dāng)前無表情包不會聊天的時代,怎么也不能輸在表情包數(shù)量不足上啊,今天咱們就來制作一個gif生成工具,用來制作表情包也太好用啦先來看看整體效果頁面設(shè)計本文工具的頁面,是通過QtDesigner來設(shè)計的,我們可以直接在安裝了PyQt5-tools的目錄下...

Python?制作?gif?生成工具,斗圖再也不會輸啦作者 | 周蘿卜來源 | 蘿卜大雜燴
在當(dāng)前無表情包不會聊天的時代,怎么也不能輸在表情包數(shù)量不足上啊,今天咱們就來制作一個 gif 生成工具,用來制作表情包也太好用啦


先來看看整體效果



Python?制作?gif?生成工具,斗圖再也不會輸啦


頁面設(shè)計

本文工具的頁面,是通過 Qt Designer 來設(shè)計的,我們可以直接在安裝了 PyQt5-tools 的目錄下找到 designer.exe 這個 EXE 執(zhí)行文件,直接執(zhí)行,比如我這里就是如下目錄


C:\Python3\Lib\site-packages\qt5_applications\Qt\bin\designer.exe


當(dāng)然也可以直接配置到 PyCharm 里,比如這樣


Python?制作?gif?生成工具,斗圖再也不會輸啦


這里的配置就一筆帶過了,如果有配置不成功的朋友可以私下了解或者直接百度也行


我們打開 Qt Designer 工具之后,可以看到如下頁面


Python?制作?gif?生成工具,斗圖再也不會輸啦


此時我們只需要妥妥拽拽就可以完成頁面的布局工作


Python?制作?gif?生成工具,斗圖再也不會輸啦


下面簡單說一下上面布局所使用的組件


  • 帶有文字“選擇圖片”和“生成gif”的組件是兩個 QPushButton
  • “選擇圖片”按鈕下方的是一個 QListVIew 組件
  • 再往下的三段文字是 QLabel 組件,后面分別對應(yīng)的 QLineEdit 組件
  • “生成gif”按鈕下方的也是兩個 QLabel 組件,分別用來預(yù)覽圖片和作者聲明
這樣我們完成布局之后,保存當(dāng)前配置,例如保存為“gif.ui”


接下來我們使用 PySide2 來實(shí)現(xiàn)頁面邏輯,所以需要先安裝這個庫


pip install PySide2
安裝完成之后,我們直接在 cmd 命令行輸入如下命令,就可以把剛剛生成的 ui 文件轉(zhuǎn)化為 py 代碼


pyside2-uic -o gif.py gif.ui
這樣一個頁面布局就完成了,而且轉(zhuǎn)化而來的頁面布局 py 文件基本不用修改,直接引用即可


核心邏輯

下面我們編寫核心邏輯,在生成的 py 文件同目錄下創(chuàng)建一個 main.py 文件,然后引用剛剛生成的 py 文件內(nèi)容


from gif import Ui_Form
from PySide2.QtWidgets import QMainWindow, QApplication, QFileDialog


class CreateGif(QMainWindow, Ui_Form):
def __init__(self):
super().__init__()
self.setupUi(self)
self.setup()
self.show()
下面我們設(shè)置 setup 函數(shù),給對應(yīng)的組件設(shè)置初始值


def setup(self):
self.imgs = None
self.gifImgName = None
self.lineEdit.setText("0")
self.lineEdit_2.setText("0")
self.lineEdit_3.setText("500")
再接下來編寫選擇圖片的函數(shù)


def choose_img(self):
self.imgs = QFileDialog.getOpenFileNames(
caption="選擇圖片", filter="")[0] # (*.png, *.jpg, *.PNG)
if self.imgs:
imgwidth, imgheight = Image.open(self.imgs[0]).size
self.lineEdit.setText(str(imgwidth))
self.lineEdit_2.setText(str(imgheight))
new_imgs = []
for img in self.imgs:
img_name = os.path.basename(img)
new_imgs.append(img_name)
strings = QStringListModel(new_imgs)
self.listView.setModel(strings)
首先通過 QFileDialog 提供的方法來獲取圖片文件,然后使用 PIL 庫讀取圖片的大小,并更新兩個 lineEdit 組件值,最后把所有選到的圖片都展示在 listView 組件當(dāng)中


Python?制作?gif?生成工具,斗圖再也不會輸啦


下面是生成 gif 的函數(shù)


def gen_gif(self):
frames = []
imgwidth = int(self.lineEdit.text())
imgheight = int(self.lineEdit_2.text())
imgspeed = int(self.lineEdit_3.text())
for img in self.imgs:
img = Image.open(img).resize((imgwidth, imgheight)).convert("RGBA")
frames.append(img)
self.gifImgName = os.path.splitext(os.path.basename(self.imgs[0]))[0]
frames[0].save(f"{self.gifImgName}.gif", append_images=frames[1:], loop=0, save_all=True, duration=imgspeed)
self.displayGif()
也不復(fù)雜,以選擇圖片的第一張名字命名要生成的 gif 圖片,然后通過 save 方法把其余圖片保存至第一張圖片當(dāng)中,類型選擇 gif 即可


最后就是展示生成 gif 的代碼


def displayGif(self):
self.movie = QMovie()
self.movie.setFileName(f"{self.gifImgName}.gif")
self.label.setMovie(self.movie)
self.movie.start()
使用 PySide2.QtGui 中的 QMovie 方法,在 label 當(dāng)中展示 gif 圖片


這樣,這個小小的 gif 制作工具就完成了,還不快一起動手做起來!


Python?制作?gif?生成工具,斗圖再也不會輸啦



本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
關(guān)閉
關(guān)閉