龙空技术网

用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)

小林努力了吗 181

前言:

目前同学们对“python图片素材”大概比较关注,我们都想要分析一些“python图片素材”的相关资讯。那么小编同时在网摘上网罗了一些对于“python图片素材””的相关文章,希望我们能喜欢,我们一起来学习一下吧!

桌面太单调?今天就带大家,一起用Python的PyQt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果!

下面,我们开始介绍这个自定义桌面动画挂件的制作过程。

一、核心功能设计

实现将动态图gif或视频转成一个桌面动画挂件,知识点主要涉及了对GIF图/视频解析,人像提取分割,PyQt5窗体设置,自定义挂件动画实现,ico图标生成,程序打包等。

拆解需求,大致可以整理出我们需要分为以下几步完成:

1.对gif或者视频进行逐帧解析,获取转换的图片,提取图像中人体区域,并对图片进行批量尺寸大小修改替换

2.初始化设置动画挂件窗体显示效果,窗体位置、大小等

3.桌面动画挂件功能实现,动画轮播、鼠标控制挂件位置拖动

4.挂件打包图标设置、打包配置

二、实现步骤解析提取,修改图片GIF图解析:

首先我们需要将Gif逐帧进行解析 ,转换成图片格式。代码如下:

from PIL import Image  # 导入PIL的Image包import osgifFileName = "./demo.gif"  # 把gif图赋值给gifFileNameim = Image.open(gifFileName)  # 使用Image的open函数打开test.gif图像pngDir = gifFileName[:-4]  # 倒着从gifFileName中的倒数第四个开始取字符(跳过.gif),赋值给pngDir,作为文件夹的名字if not os.path.exists(pngDir):    os.makedirs('./img')  # 用图片名创建一个文件夹,用来存放每帧图片,名字为pngDir的值try:  while True:  # 死循环    current = im.tell()  # 用tell函数保存当前帧图片,赋值给current    im.save(pngDir+'/'+str(current+1)+'.png')  # 调用save函数保存该帧图片    im.seek(current+1)  # 调用seek函数获取下一帧图片,参数变为current帧图片+1    # 这里再次进入循环,当为最后一帧图片时,seek会抛出异常,代码执行exceptexcept EOFError:    pass  # 最后一帧时,seek抛出异常,进入这里,pass跳过

gif逐帧转为图片,效果如下:

视频解析:

对视频解析,也是逐帧进行解析,转换成若干张图片,代码如下:

# 将视频按照每一帧转成图片pngimport cv2videoFileName = "./demo.mp4"  # 把视频路径赋值给videoFileNamepngDir = videoFileName[:-4]  # 倒着从gifFileName中的倒数第四个开始取字符(跳过.后缀),赋值给pngDir,作为文件夹的名字if not os.path.exists(pngDir):    os.makedirs(pngDir)  # 用图片名创建一个文件夹,用来存放每帧图片,名字为pngDir的值# 视频处理 分割成一帧帧图片cap = cv2.VideoCapture(videoFileName)num = 1while True:    # 逐帧读取视频  按顺序保存到本地文件夹    ret, frame = cap.read()    if ret:        cv2.imwrite(f"{pngDir}/{num}.png", frame)  # 保存一帧帧的图片        num += 1    else:        breakcap.release()   # 释放资源
桌面小部件功能初始化动画部件
# 窗体初始化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)))

这样只是完成了图片的静态显示,下面我们来完成图片的动态轮播效果

动画轮播:

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)
鼠标控制挂件位置拖动:
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()

到此为止,桌面小部件已开发完成,效果如下:

可以使用将程序打包为exe可执行文件直接发给你的朋友,这样就不用安装python环境了。

公众号:Python编程站

源码及图片素材已经放在公众号了

回复关键字:“冰墩墩雪容融桌面部件

即可领取完整源码。

给个赞吧!!

标签: #python图片素材