TIPS:
程序效果:
视频地址 :哔哩哔哩个人空间(可能还没过审,2020 5.16 上传的。)
以上效果可在下面的项目中实现,视频中出现的文字可以修改,但是为了防止个别童靴的‘’拿来主义‘’这里就不说明哪里改了,自己慢慢看。
文末获取完整码源。
项目结构
废话不多说,先来看看项目:
这里先介绍一下各个模块的功能
Fold_win用于生成一个窗口,主要用于最后面显示表白语句。
main主控程序,负责最后的效果呈现。
Image_c负责对图像进行处理,添加图片水印,设置壁纸。
set_p_w获取相应的图片资源和表白的句子,主要是爬虫去爬取。
这里要说明一下的是虽然爬虫会爬取相应的资源,但是有一个文件必须手动下载,也就是自己去找,如图:
这三个爬虫没有去爬取需要自己下载设置,当然你可以在文末获取完整码源。
获取图片
表白么,怎么也得弄几张背景图片衬托一下。
下面是
set_p_w
文件
import requests
import os
import re
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) \
Chrome/80.0.3987.149 Safari/537.36'}
def get_iamges():
try:
images_path='D:/Confession/image'
if not os.path.exists(images_path):
os.makedirs(images_path)
url='http://pic.netbian.com/e/search/result/?searchid=18'
data=requests.get(url,headers=header)
data=data.content.decode('gbk')
#print(data)
path='</b></a></li><li><a href="(.*?)" target="_blank"><img src="/'
path=re.compile(path,re.M)
url_=path.findall(data)
#print(url_)
view_url=[]
urlx='http://pic.netbian.com'
for i in url_:
url_l=urlx+i
view_url.append(url_l)
#print(view_url)
path_2='<a href="" id="img"><img src="(.*?)" data-pic="'
path_2=re.compile(path_2)
number=0
pics_url=[]
for i in view_url:
data_=requests.get(i,header)
data_2=data_.content.decode('gbk')
pic_=path_2.findall(data_2)[0]
pic_url=urlx+pic_
pics_url.append(pic_url)
if not os.path.exists(images_path):
os.makedirs(images_path)
data_p_=requests.get(pic_url,header)
data_p=data_p_.content
path_image_one=images_path+'/'+str(number)+'.jpg'
number+=1
with open(path_image_one,'wb') as f:
f.write(data_p)
f.close()
except Exception as e:
print(e)
#print(pics_url)
#get_iamges()
def get_words():
try:
path='D:/Confession/words'
if not os.path.exists(path):
os.makedirs(path)
url_w='https://baijiahao.baidu.com/s?id=1634005464753918917&wfr=spider&for=pc'
data_w=requests.get(url_w,header)
data_w=data_w.content.decode('utf-8')
path_w_r='<span class="bjh-p">..(.*?).?</span>'
path_w_r=re.compile(path_w_r)
words=path_w_r.findall(data_w)
del words[-1]
del words[-1]
save_path=path+'/'+'word.love'
with open(save_path,'w',encoding='utf-8') as f:
f.write(str(words))
f.close()
except Exception as e:
print(e)
if __name__=='__main__':
get_iamges()
get_words()
``如上所示他还爬取了情话,当然你也可以自己写,存入D:\Confession\words\word.love。注意这里是写入list
图片处理
Image_c 的功能
首先代码如下:
from PIL import Image, ImageDraw, ImageFont,ImageSequence
import win32api
import win32con
import win32gui
import os
def add_word(image, text, color=None):
try:
font=ImageFont.truetype("simsun.ttc", 30)
r_image = image.convert('RGBA')
text_lay = Image.new('RGBA', r_image.size, (255, 255, 255, 0))
image_draw = ImageDraw.Draw(text_lay)
text_x_, text_y_ = image_draw.textsize(text, font=font)
text_xy = ((r_image.size[0] - text_x_) / 2, (r_image.size[1] - text_y_) / 2)
image_draw.text(text_xy, text, color, font=font)
image_ok=Image.alpha_composite(r_image,text_lay)
#image_ok.show()
return image_ok
except Exception as e:
print(e)
def watermark_on_gif(in_gif, out_gif, text='test'):
"""给gif添加水印,由于图像处理问题部分图像处理后会程灰黑色"""
frames = []
font = ImageFont.truetype('simsun.ttc', 44)
im = Image.open(in_gif)
water_im = Image.new("RGBA", im.size,(255, 255, 255, 0))
draw = ImageDraw.Draw(water_im)
text_x_, text_y_ = draw.textsize(text, font=font)
text_xy = ((im.size[0] - text_x_) / 2, (im.size[1] - text_y_) / 2)
draw.text(text_xy, text,font=font)
for frame in ImageSequence.Iterator(im):
frame = frame.convert("RGBA")
frame.paste(water_im, None,water_im)
frames.append(frame)
newgif = frames[0]
# quality参数为质量,time为每幅图像播放的毫秒时间
newgif.save(out_gif, save_all=True,
append_images=frames[1:], quality=300, time=100)
im.close()
def setWallpaperFromBMP(imagepath):
k = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
win32api.RegSetValueEx(k, "WallpaperStyle", 0, win32con.REG_SZ, "2") #2拉伸适应桌面,0桌面居中
win32api.RegSetValueEx(k, "TileWallpaper", 0, win32con.REG_SZ, "0")
win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER,imagepath, 1+2)
def setWallPaper(imagePath,name):
"""
Given a path to an image, convert it to bmp and set it as wallpaper
"""
StoreFolder=r'D:\Confession\image_add_w'
if not os.path.exists(r'D:\Confession\image_add_w'):
os.makedirs(StoreFolder)
bmpImage = Image.open(imagePath)
newPath = StoreFolder + '\\'+str(name)+'.bmp'
bmpImage.save(newPath, "BMP")
setWallpaperFromBMP(newPath)
if __name__=='__main__':
setWallPaper(r'D:\Confession\image\0.jpg',0)
im_test=Image.open(r'D:\Confession\image\0.jpg')
im_t=add_word(im_test,'''sdad\nsadasdas''')
#im_t.show()
#im_t.save('1.png','png')
watermark_on_gif(r'D:\Confession\image\1.gif',r'D:\Confession\image\use.gif','XIA MENG I COMING')
这里有两个关于图像处理的,和一个设置壁纸的函数。
其中
```python
def watermark_on_gif(in_gif, out_gif, text='test'):
"""给gif添加水印,由于图像处理问题部分图像处理后会程灰黑色"""
frames = []
font = ImageFont.truetype('simsun.ttc', 44)
im = Image.open(in_gif)
water_im = Image.new("RGBA", im.size,(255, 255, 255, 0))
draw = ImageDraw.Draw(water_im)
text_x_, text_y_ = draw.textsize(text, font=font)
text_xy = ((im.size[0] - text_x_) / 2, (im.size[1] - text_y_) / 2)
draw.text(text_xy, text,font=font)
for frame in ImageSequence.Iterator(im):
frame = frame.convert("RGBA")
frame.paste(water_im, None,water_im)
frames.append(frame)
newgif = frames[0]
# quality参数为质量,time为每幅图像播放的毫秒时间
newgif.save(out_gif, save_all=True,
append_images=frames[1:], quality=300, time=100)
im.close()
用于处理gif动图,当然有一些瑕疵。而这个函数的主要目的是为了处理gif图片加入水印,之后在tkinter的窗口显示。
(处理侯的gif)
窗口处理
现在万事俱备,但是如果只是单纯的换壁纸没啥意思,所以我们在来一个动态窗口,用tkinter播放gif动图。
Fold_win函数。代码如下:
import tkinter as tk
import threading
def root_show(x_,y_,width,height,path,part):
try:
root =part
screen_width=root.winfo_screenwidth()
screen_height=root.winfo_screenheight()
x=int((screen_width-width)/x_)
y=int((screen_height-height)/y_)
root.geometry(str(width)+'x'+str(height)+'+'+(str(x))+'+'+(str(y)))
root.overrideredirect(True)
#播放gif动态图
unmdex=25#设置帧数
frames=[tk.PhotoImage(file=path,format='gif -index %i' %(i)) for i in range(unmdex)]
def update(id_x):
frame=frames[id_x]
id_x+=1
label_1.configure(image=frame)
root.after(100,update,id_x%unmdex)
def down():
root.quit()
label_1=tk.Label(root)
label_1.pack()
root.after(0,update,0)
root.after(10000,down)
root.mainloop()
except Exception as e:
print(e)
if __name__=='__main__':
try:
def first():
root_show(4,2,300,300,'image/01.gif',tk.Tk())
def secend():
root_show(2, 2,350, 100, 'image/02.gif', tk.Toplevel())
#在tkinter中只允许一个窗口的创建另一个窗口必须位frame或者置顶窗口
Trade=[]#创建线程
t_f=threading.Thread(target=first)
Trade.append(t_f)
t_s=threading.Thread(target=secend)
Trade.append(t_s)
for t in Trade:
t.setDaemon(True)
t.start()
t_f.join()
t_s.join()
except Exception as e:
print(e)
这里,你们可能注意到了单独运行该模块可以同时运行两个窗口,这里蹦来是想要同时形成一个爱心矩阵播放动图来着的,但是这里比较麻烦,就算了,有兴趣的话你们可以试试。
(这里没有调好窗口位置)
主控程序
也就是main函数,来,继续上代码。
import set_p_w ,image_c,Fold_win
from PIL import Image
import time
import tkinter as tk
import playsound
import os
import threading
def star_inital():
try:
sign_mark_0=r'D:\Confession\image\use.gif'
sign_mark_1=r'D:\Confession\words'
def do_fist():
if not os.path.exists(sign_mark_0):
image_c.watermark_on_gif(r'D:\Confession\image\1.gif',r'D:\Confession\image\use.gif','XIA MENG I COMING!')
def do_secend():
if not os.path.exists(sign_mark_1):
set_p_w.get_iamges()
def do_third():
if not os.path.exists(sign_mark_1):
set_p_w.get_iamges()
Tade=[]
t_1=threading.Thread(target=do_fist)
Tade.append(t_1)
t_2=threading.Thread(target=do_secend)
Tade.append(t_2)
t_3=threading.Thread(target=do_third)
Tade.append(t_3)
for t in Tade:
t.setDaemon(True)
t.start()
t_1.join()
t_2.join()
t_3.join()
except Exception as e:
print(e)
def word_read():
with open(r'D:\Confession\words\word.love','r',encoding='utf-8') as w:
word_=w.read()
safe={}
word_=eval(word_,safe)
w.close()
#print(word_)
bad_word='<span class="bjh-br"'
word=[]
for wo_ in word_:
if bad_word in wo_ :
wo_=wo_.replace(bad_word,' ')
wo_=wo_.replace(',','\n')
wo_=wo_+'\n BY_HUTEROX(可删去)'
word.append(wo_)
else:
wo_ = wo_.replace(',', '\n')
#print(wo_)
wo_ = wo_ + '\n BY_HUTEROX(可删去)'
word.append(wo_)
#print(word)
return word
star_inital()
'''完成初始化这里请注意 D:\Confession\image\1.gif 需要自己额外下载,其余的可以通过爬虫自动下载'''
def show():
pic_n=0
path_u=r'D:\Confession\image_add_w\mark_image.png'
word=word_read()
for text in word:
path = 'D:\\Confession\\image\\' + str(pic_n) + '.jpg'
pic_n+=1
im_test = Image.open(path)
im_t = image_c.add_word(im_test, text)
im_t.save(path_u)
image_c.setWallPaper(path_u,0)
time.sleep(4)#参数可调
Fold_win.root_show(2, 2,600, 600,r'D:\Confession\image\use.gif',tk.Tk())
time.sleep(10)
def play_sound():
path=r'D:\Confession\music\music.mp3'
playsound.playsound(path)
#play_sound()
def go():
Tade_=[]
tx_1=threading.Thread(target=show)
Tade_.append(tx_1)
tx_2=threading.Thread(target=play_sound)
Tade_.append(tx_2)
for x in Tade_:
x.setDaemon(True)
x.start()
tx_1.join()
#tx_2.join()二选一
go()
这里要提醒一下,就是star_inital()函数,它的作用就是初始化(本来是定义了一个类的,比较懒写了个函数。)把相应的要使用的媒体资源加载好。但是有时候会出问题。所以你可以先把其他的模块运行一遍,再跑一遍主函数。
这里还有一个MP3文件要注意一下。
这玩意,也就是背景音乐。哦对了,你还可以自己再写一个计时,先让主程序运行,然后程序计时,等你女票来了刚刚好运行效果。(PS:本人严格遵守《中学生行为规范》)
SUMMARY:
时间有限,水平有限,如有不足多多指教!
码源地址:
链接:https://pan.baidu.com/s/1X9pstnTI3X3qUZeERXILiQ
提取码:i0o2
转载:https://blog.csdn.net/FUTEROX/article/details/106163416