- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章用Python做个个性的动画挂件让桌面不单调由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前段时间,写了篇博客自己用python做的一款超炫酷音乐播放器。有粉丝问我,音乐播放器为什么要用pyqt5,效果是不是比tkinter赞?pyqt5真的可以实现这些炫酷的ui画面吗?之前没接触过pyqt5,能不能多分享一些这方面的开发案例?
今天就带大家,一起用python的pyqt5开发一个有趣的自定义桌面动画挂件,看看实现的动画挂件效果! 。
下面,我们开始介绍这个自定义桌面动画挂件的制作过程.
总体来说,我们需要实现将自己喜欢的动态图gif或者视频转成一个桌面动画挂件,知识点主要包含了对gif图/视频解析,人像提取分割,pyqt5窗体设置,自定义挂件动画实现,ico图标生成,程序打包等.
拆解需求,大致可以整理出我们需要分为以下几步完成:
gif图解析:
gif动态图资源大家可以根据自己的喜好,自己选择。博主就用之前写过的仙女蹦迪动态gif来演示效果.
首先我们需要将gif动态图按照每一帧进行解析 ,转换成图片格式。代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
from
pil
import
image
# 导入pil的image包
import
os
giffilename
=
"./demo.gif"
# 把gif图赋值给giffilename
im
=
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会抛出异常,代码执行except
except
eoferror:
pass
# 最后一帧时,seek抛出异常,进入这里,pass跳过
|
这样就可以把动态gif图转换成图片了,效果如下
视频解析:
同理,对视频解析,也是按照每一帧进行解析,转换成图片格式。核心代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# 将视频按照每一帧转成图片png
import
cv2
videofilename
=
"./demo.mp4"
# 把视频路径赋值给videofilename
pngdir
=
videofilename[:
-
4
]
# 倒着从giffilename中的倒数第四个开始取字符(跳过.后缀),赋值给pngdir,作为文件夹的名字
if
not
os.path.exists(pngdir):
os.makedirs(pngdir)
# 用图片名创建一个文件夹,用来存放每帧图片,名字为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()
# 释放资源
|
效果如下:
逐帧提取的图片已经拿到了,下面我们需要对这些图片中的人像进行分割提取.
人像分割:
我们调用的是百度开放的人体分析接口 – 百度ai开放平台链接.
这里面我们可以创建一个人像分割的应用,其中的api key及secret key后面我们调用人脸识别检测接口时会用到.
我们可以看到官方提供的帮助文档,介绍地很详细。如何调用请求url数据格式,向api服务地址使用post发送请求,必须在url中带上参数access_token,可通过后台的api key和secret key生成。这里面的api key和secret key就是我们上面提到的.
那我们如何获取空背景的人像图片呢?根据api文档,可以看到里面有个type属性设置为foreground 就可以提取空背景的人像图片.
人像分割的接口流程基本就已经清楚了,可以进行代码实现了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# 保存图片
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"
# 二进制方式打开图片文件
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)
|
这样我们就可以根据图片,进行人像分割,提取出空背景的人像图。效果如下:
如果提取的人像图片大小不符合我们的要求,我们还可以对图片大小进行调整.
1
2
3
4
5
6
7
8
9
10
|
file_list
=
os.listdir(
"./image"
)
# 读取当前文件夹所有文件
# 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)
|
我们需要的空背景图片已经拿到了,接下来我们来实现桌面挂件功能.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
# 窗体初始化
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)))
|
这样图片挂件就可以显示出来,效果如下:
现在的桌面挂件是静态显示,下面我们可以通过计时器进行挂件动画轮播显示.
动画轮播:
1
2
3
4
5
6
7
8
9
10
11
|
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)
|
鼠标控制挂件位置拖动:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
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()
|
至此,自定义动画挂件功能已经实现完成,动画挂件效果如下:
前段时间有粉丝问我,python能不能打包成exe?如何打包呢?今天就通过这个来一起介绍下.
python常用的打包工具是第三方库pyinstaller,首先需要安装下pyinstaller.
1
|
pip install pyinstaller
|
接下来,我们需要打开命令窗口,切换到项目目录下再执行打包命令.
1
|
pyinstaller
-
f
-
i .
/
img.ico qt_gadgets.py
|
打包常用的参数如下:
之前有小伙伴问我,打包的图标需要.ico后缀的图片,应该如何把普通图片转成图标格式.ico呢?python当然可以帮你实现,今天就一起教给大家。核心代码如下:
1
2
3
4
5
6
7
|
import
pythonmagick
# 生成图标ico(png格式图片转成ico)
img
=
pythonmagick.image(
'./image/img1/1.png'
)
# 这里要设置一下尺寸,不然会报ico尺寸异常错误
img.sample(
'128x128'
)
img.write(
'./img.ico'
)
|
图标得到了,下面我们就可以进行打包操作了.
打包完成之后,我们可以看见项目目录下会有生成的exe程序.
至此,整个自定义动画挂件就全部完成了,下面我们一起运行下exe看看动画挂件效果.
今天我们就到这里,明天继续努力! 。
如果本篇博客有任何错误,请批评指教,不胜感激 ! 。
到此这篇关于用python做个个性的动画挂件让桌面不单调的文章就介绍到这了,更多相关python自定义动画挂件内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/hhladminhhl/article/details/119568090 。
最后此篇关于用Python做个个性的动画挂件让桌面不单调的文章就讲到这里了,如果你想了解更多关于用Python做个个性的动画挂件让桌面不单调的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在寻找一种快速方法来使 pandas 数据帧在 x 中单调。 我当前的解决方案如下: def make_monotonic(df, cols=None): """make df monot
CLOCK_REALTIME 的一个问题是它不是单调的,如果发生 NTP 同步,时间可能会倒退。 像下面这样的事情让它变得单调是否安全? struct timespec GetMonotonicTim
我是一名优秀的程序员,十分优秀!