亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

用Python做個個性的動畫掛件讓桌面不單調(diào)

 更新時間:2021年08月26日 14:55:14   作者:Dragon少年  
這篇文章主要介紹了如何用Python做個個性的動畫掛件,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

前言

前段時間,寫了篇博客自己用python做的一款超炫酷音樂播放器。有粉絲問我,音樂播放器為什么要用PyQt5,效果是不是比Tkinter贊?PyQt5真的可以實(shí)現(xiàn)這些炫酷的UI畫面嗎?之前沒接觸過PyQt5,能不能多分享一些這方面的開發(fā)案例?

今天就帶大家,一起用Python的PyQt5開發(fā)一個有趣的自定義桌面動畫掛件,看看實(shí)現(xiàn)的動畫掛件效果!

在這里插入圖片描述

下面,我們開始介紹這個自定義桌面動畫掛件的制作過程。

一、核心功能設(shè)計(jì)

總體來說,我們需要實(shí)現(xiàn)將自己喜歡的動態(tài)圖gif或者視頻轉(zhuǎn)成一個桌面動畫掛件,知識點(diǎn)主要包含了對GIF圖/視頻解析,人像提取分割,PyQt5窗體設(shè)置,自定義掛件動畫實(shí)現(xiàn),ico圖標(biāo)生成,程序打包等。

拆解需求,大致可以整理出我們需要分為以下幾步完成:

  1. 對gif或者視頻進(jìn)行逐幀解析,獲取轉(zhuǎn)換的圖片,提取圖像中人體區(qū)域,并對圖片進(jìn)行批量尺寸大小修改替換
  2. 初始化設(shè)置動畫掛件窗體顯示效果,窗體位置、大小等
  3. 桌面動畫掛件功能實(shí)現(xiàn),動畫輪播、鼠標(biāo)控制掛件位置拖動
  4. 掛件打包圖標(biāo)設(shè)置、打包配置

二、實(shí)現(xiàn)步驟

1. 解析提取,修改圖片

GIF圖解析:

Gif動態(tài)圖資源大家可以根據(jù)自己的喜好,自己選擇。博主就用之前寫過的仙女蹦迪動態(tài)Gif來演示效果。

在這里插入圖片描述

首先我們需要將Gif動態(tài)圖按照每一幀進(jìn)行解析 ,轉(zhuǎn)換成圖片格式。代碼如下:

from PIL import Image  # 導(dǎo)入PIL的Image包
import os
gifFileName = "./demo.gif"  # 把gif圖賦值給gifFileName
im = Image.open(gifFileName)  # 使用Image的open函數(shù)打開test.gif圖像
pngDir = gifFileName[:-4]  # 倒著從gifFileName中的倒數(shù)第四個開始取字符(跳過.gif),賦值給pngDir,作為文件夾的名字
if not os.path.exists(pngDir):
    os.makedirs('./img')  # 用圖片名創(chuàng)建一個文件夾,用來存放每幀圖片,名字為pngDir的值

try:
  while True:  # 死循環(huán)
    current = im.tell()  # 用tell函數(shù)保存當(dāng)前幀圖片,賦值給current
    im.save(pngDir+'/'+str(current+1)+'.png')  # 調(diào)用save函數(shù)保存該幀圖片
    im.seek(current+1)  # 調(diào)用seek函數(shù)獲取下一幀圖片,參數(shù)變?yōu)閏urrent幀圖片+1
    # 這里再次進(jìn)入循環(huán),當(dāng)為最后一幀圖片時,seek會拋出異常,代碼執(zhí)行except
except EOFError:
    pass  # 最后一幀時,seek拋出異常,進(jìn)入這里,pass跳過

這樣就可以把動態(tài)Gif圖轉(zhuǎn)換成圖片了,效果如下:

在這里插入圖片描述

視頻解析:

同理,對視頻解析,也是按照每一幀進(jìn)行解析,轉(zhuǎn)換成圖片格式。核心代碼如下:

# 將視頻按照每一幀轉(zhuǎn)成圖片png
import cv2
videoFileName = "./demo.mp4"  # 把視頻路徑賦值給videoFileName
pngDir = videoFileName[:-4]  # 倒著從gifFileName中的倒數(shù)第四個開始取字符(跳過.后綴),賦值給pngDir,作為文件夾的名字
if not os.path.exists(pngDir):
    os.makedirs(pngDir)  # 用圖片名創(chuàng)建一個文件夾,用來存放每幀圖片,名字為pngDir的值
# 視頻處理 分割成一幀幀圖片
cap = cv2.VideoCapture(videoFileName)
num = 1
while True:
    # 逐幀讀取視頻  按順序保存到本地文件夾
    ret, frame = cap.read()
    if ret:
        cv2.imwrite(f"{pngDir}/{num}.png", frame)  # 保存一幀幀的圖片
        num += 1
    else:
        break
cap.release()   # 釋放資源

效果如下:

在這里插入圖片描述

逐幀提取的圖片已經(jīng)拿到了,下面我們需要對這些圖片中的人像進(jìn)行分割提取。

人像分割:

我們調(diào)用的是百度開放的人體分析接口百度AI開放平臺鏈接

在這里插入圖片描述

這里面我們可以創(chuàng)建一個人像分割的應(yīng)用,其中的API Key及Secret Key后面我們調(diào)用人臉識別檢測接口時會用到。

在這里插入圖片描述

我們可以看到官方提供的幫助文檔,介紹地很詳細(xì)。如何調(diào)用請求URL數(shù)據(jù)格式,向API服務(wù)地址使用POST發(fā)送請求,必須在URL中帶上參數(shù)access_token,可通過后臺的API Key和Secret Key生成。這里面的API Key和Secret Key就是我們上面提到的。


在這里插入圖片描述

那我們?nèi)绾潍@取空背景的人像圖片呢?根據(jù)API文檔,可以看到里面有個type屬性設(shè)置為foreground 就可以提取空背景的人像圖片。

在這里插入圖片描述

人像分割的接口流程基本就已經(jīng)清楚了,可以進(jìn)行代碼實(shí)現(xiàn)了。

# 保存圖片
def save_base_image(img_str, filename):
    img_data = base64.b64decode(img_str)
    with open(filename, 'wb') as f:
        f.write(img_data)

# 獲取token
def get_token():
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
    request = urllib.request.Request(host)
    request.add_header('Content-Type', 'application/json; charset=UTF-8')
    response = urllib.request.urlopen(request)
    token_content = response.read()
    if token_content:
        token_info = json.loads(token_content)
        token_key = token_info['access_token']
    return token_key

# 人像分割
def body_seg_fore(filename, resultfilename):
    request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/body_seg"

    # 二進(jìn)制方式打開圖片文件
    f = open(filename, 'rb')
    img = base64.b64encode(f.read())

    params = dict()
    params['image'] = img
    params['type'] = 'foreground'
    params = urllib.parse.urlencode(params).encode("utf-8")
    # params = json.dumps(params).encode('utf-8')

    access_token = get_token()
    request_url = request_url + "?access_token=" + access_token
    request = urllib.request.Request(url=request_url, data=params)
    request.add_header('Content-Type', 'application/x-www-form-urlencoded')
    response = urllib.request.urlopen(request)
    content = response.read()
    if content:
        # print(content)
        content = content.decode('utf-8')
        # print(content)
        data = json.loads(content)
        # print(data)
        img_str = data['foreground']
        save_base_image(img_str, resultfilename)

這樣我們就可以根據(jù)圖片,進(jìn)行人像分割,提取出空背景的人像圖。效果如下:

在這里插入圖片描述
在這里插入圖片描述

如果提取的人像圖片大小不符合我們的要求,我們還可以對圖片大小進(jìn)行調(diào)整。

file_list = os.listdir("./image")  # 讀取當(dāng)前文件夾所有文件
# print(file_list)
n = len(file_list)
for i in range(n):
    s = str(file_list[i])
    if s[-4:] == ".png":  # 檢查后綴
        src = os.path.join(os.path.abspath('./image/'), s)  # 原先的圖片名字
        img = Image.open(src)
        new_img = img.resize((128, 128), Image.BILINEAR)
        new_img.save(src)

我們需要的空背景圖片已經(jīng)拿到了,接下來我們來實(shí)現(xiàn)桌面掛件功能。

2.初始化動畫掛件

# 窗體初始化
def windowinit(self):
    self.x = 1650
    self.y = 860
    self.setGeometry(self.x, self.y, 300, 300)
    self.setWindowTitle('My Gadgets')
    self.img_num = 1
    self.img_path = './image/{file}/{img}.png'.format(file=self.dis_file, img=str(self.img_num))
    self.lab = QLabel(self)
    self.qpixmap = QPixmap(self.img_path)
    self.lab.setPixmap(self.qpixmap)
    self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint | Qt.SubWindow)
    self.setAutoFillBackground(False)
    self.setAttribute(Qt.WA_TranslucentBackground, True)
    self.show()

def __init__(self):
    super(Gadgets, self).__init__()

    self.dis_file = "img1"
    self.windowinit()
    self.icon_quit()

    self.pos_first = self.pos()
    self.img_count = len(os.listdir('./image/{}'.format(self.dis_file)))

這樣圖片掛件就可以顯示出來,效果如下:

在這里插入圖片描述

現(xiàn)在的桌面掛件是靜態(tài)顯示,下面我們可以通過計(jì)時器進(jìn)行掛件動畫輪播顯示。

3.動畫掛件功能實(shí)現(xiàn)

動畫輪播:

self.timer = QTimer()
self.timer.timeout.connect(self.img_update)
self.timer.start(100)
def img_update(self):
    if self.img_num < self.img_count:
        self.img_num += 1
    else:
        self.img_num = 1
    self.img_path = './image/{file}/{img}.png'.format(file=self.dis_file, img=str(self.img_num))
    self.qpixmap = QPixmap(self.img_path)
    self.lab.setPixmap(self.qpixmap)

鼠標(biāo)控制掛件位置拖動:

def mousePressEvent(self, QMouseEvent):
    if QMouseEvent.button() == Qt.LeftButton:
        self.pos_first = QMouseEvent.globalPos() - self.pos()
        QMouseEvent.accept()
        self.setCursor(QCursor(Qt.OpenHandCursor))

def mouseMoveEvent(self, QMouseEvent):
    if Qt.LeftButton:
        self.move(QMouseEvent.globalPos() - self.pos_first)
        print(self.pos())
        self.x, self.y = self.pos().x, self.pos().y
        QMouseEvent.accept()

def quit(self):
    self.close()
    sys.exit()

至此,自定義動畫掛件功能已經(jīng)實(shí)現(xiàn)完成,動畫掛件效果如下:

在這里插入圖片描述

4.打包配置

前段時間有粉絲問我,Python能不能打包成exe?如何打包呢?今天就通過這個來一起介紹下。

Python常用的打包工具是第三方庫Pyinstaller,首先需要安裝下pyinstaller。

pip install Pyinstaller

接下來,我們需要打開命令窗口,切換到項(xiàng)目目錄下再執(zhí)行打包命令。

pyinstaller -F -i ./img.ico Qt_Gadgets.py

打包常用的參數(shù)如下:

  • -F 表示生成單個可執(zhí)行文件
  • -w 表示去掉控制臺窗口,這在GUI界面時非常有用。不過如果是命令行程序的話那就把這個選項(xiàng)刪除吧!
  • -p 表示你自己自定義需要加載的類路徑,一般情況下用不到
  • -i 表示可執(zhí)行文件的圖標(biāo)

之前有小伙伴問我,打包的圖標(biāo)需要.ico后綴的圖片,應(yīng)該如何把普通圖片轉(zhuǎn)成圖標(biāo)格式.ico呢?Python當(dāng)然可以幫你實(shí)現(xiàn),今天就一起教給大家。核心代碼如下:

import PythonMagick

# 生成圖標(biāo)ico(png格式圖片轉(zhuǎn)成ico)
img = PythonMagick.Image('./image/img1/1.png')
# 這里要設(shè)置一下尺寸,不然會報(bào)ico尺寸異常錯誤
img.sample('128x128')
img.write('./img.ico')

圖標(biāo)得到了,下面我們就可以進(jìn)行打包操作了。

在這里插入圖片描述

打包完成之后,我們可以看見項(xiàng)目目錄下會有生成的exe程序。

在這里插入圖片描述

至此,整個自定義動畫掛件就全部完成了,下面我們一起運(yùn)行下exe看看動畫掛件效果。

在這里插入圖片描述

今天我們就到這里,明天繼續(xù)努力!

在這里插入圖片描述

如果本篇博客有任何錯誤,請批評指教,不勝感激 !

到此這篇關(guān)于用Python做個個性的動畫掛件讓桌面不單調(diào)的文章就介紹到這了,更多相關(guān)Python自定義動畫掛件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實(shí)現(xiàn)自動生成C++代碼的代碼生成器

    python實(shí)現(xiàn)自動生成C++代碼的代碼生成器

    這篇文章介紹了python實(shí)現(xiàn)C++代碼生成器的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • 詳解python中常用配置的讀取方法

    詳解python中常用配置的讀取方法

    常見的應(yīng)用配置方式有環(huán)境變量和配置文件,對于微服務(wù)應(yīng)用,還會從配置中心加載配置,本文主要介紹了從環(huán)境變量、.env文件、.ini文件、.yaml文件等文件的讀取配置,需要的可以參考下
    2024-01-01
  • Django后端按照日期查詢的方法教程

    Django后端按照日期查詢的方法教程

    這篇文章主要給大家介紹了關(guān)于Django后端按照日期查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Python?time三種時間轉(zhuǎn)換小結(jié)

    Python?time三種時間轉(zhuǎn)換小結(jié)

    本文主要介紹了Python?time三種時間轉(zhuǎn)換小結(jié),主要包括時間戳,結(jié)構(gòu)化時間,字符串時間,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • tracemalloc分析內(nèi)存使用情況與泄露方式

    tracemalloc分析內(nèi)存使用情況與泄露方式

    這篇文章主要介紹了tracemalloc分析內(nèi)存使用情況與泄露方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題

    關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題

    這篇文章主要介紹了關(guān)于jupyter lab安裝及導(dǎo)入tensorflow找不到模塊的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Python中修改字符串的四種方法

    Python中修改字符串的四種方法

    在Python中,字符串是不可變類型,即無法直接修改字符串的某一位字符。這篇文章主要介紹了Python中修改字符串的四種方法,需要的朋友可以參考下
    2018-11-11
  • Python中unittest的斷言方法詳解

    Python中unittest的斷言方法詳解

    大家好,本篇文章主要講的是Python中unittest的斷言方法詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • Python 3.x 判斷 dict 是否包含某鍵值的實(shí)例講解

    Python 3.x 判斷 dict 是否包含某鍵值的實(shí)例講解

    今天小編就為大家分享一篇Python 3.x 判斷 dict 是否包含某鍵值的實(shí)例講解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 基于Python實(shí)現(xiàn)炸彈人小游戲

    基于Python實(shí)現(xiàn)炸彈人小游戲

    這篇文章主要介紹了基于Python中的Pygame模塊實(shí)現(xiàn)的炸彈人小游戲,文中的示例代碼講解詳細(xì),對學(xué)習(xí)Python有一定的幫助,感興趣的小伙伴可以學(xué)習(xí)一下
    2021-12-12

最新評論