1.为了把文件夹内的照片作为桌面壁纸,有一些竖版的照片作为壁纸不好看,于是先把文件夹内竖版照片两张两张平到一起,为防止两张竖版图片分辨率大小不一样,会先把小的那张放大和大的一样高后再进行拼接。
import os
from os import listdir
from PIL import Image, ImageOps
# 把两张图片拼接在一起 img1 2 是pil读出来的参数
def compose_pic(img1, img2):
w1, h1 = img1.width,img1.height
w2, h2 = img2.width,img2.height
# print((w2*h1)/h2)
if h2 > h1:
img1 = img1.resize((int((w1*h2)/h1), h2), Image.BILINEAR)
print('调整图片1')
elif img2.height < img1.height:
img2 = img2.resize((int((w2*h1)/h2), h1), Image.BILINEAR)
print('调整图片2')
else:
# width, height = img1.size
print('不调整图片')
ims = [img1, img2]
result = Image.new(img1.mode, ((img1.width+img2.width), img2.height))
for i, im in enumerate(ims):
# print(im)
result.paste(im, box=(i * img1.width, 0))
return result
#把path文件夹下的所有照片进行拼接操作
def compose_all(path):
file_list = os.listdir(path)
end_list = ['.jpg','.JPG','.jpeg','.JPEG','.png','.PNG']
im_list = []
for f in file_list:
# print(f)
f_end = f'.{f.split(".")[-1]}'
# print(f_end)
if f_end in end_list:
# print(f)
im_list.append(path + "/" + f)
# print(im_list)
im_ver_path = []
im_vertical = []
for im in im_list:
im_read = ImageOps.exif_transpose(Image.open(im)) #Image.open打开的照片横竖会错乱,所以由ImageOps.exif_transpose打开
if im_read.width < im_read.height:
im_vertical.append(im_read)
im_ver_path.append(im)
print(im_vertical)
if len(im_vertical) % 2 != 0: #如果有奇数张竖版照片的话就复制最后一张照片
im_vertical.append(im_vertical[-1])
print(im_vertical)
for i in range(len(im_vertical)):
if (i % 2 == 0):
img1 = im_vertical[i]
img2 = im_vertical[i+1]
print(img1,img2)
new_img = compose_pic(img1, img2)
# print(new_img)
new_img.save(path + "/拼图"+str(i)+'.jpg')
print(im_ver_path)
for im_used in im_ver_path:
os.remove(im_used)
拼接效果⬆
2.所有文件夹内的照片都处理完后发现大部分照片比例位4:3,设置为桌面时两边有黑边,如果用拉伸的效果的话就会把照片拉伸任务变形,所以决定对照片进行处理,用PIL库将照片拉伸到16:9后,在进行高斯模糊,然后把把原照片贴到上边 ,这样就有两边模糊的效果。记得备份原照片。
import os
from os import listdir
from PIL import Image, ImageOps,ImageFilter,ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
#导入了上边代码解决OSError: broken data stream when reading image file报错
def deal_pic(pic_path):
img = ImageOps.exif_transpose(Image.open(pic_path))
if img.width/img.height > 1.7:
print('图片已经是16:9')
return
img_new = Image.new(img.mode, (int(img.height*16/9),img.height))
img1 = img.resize((int(img.height*16/9),img.height) ,Image.BILINEAR)
# print(img_new)
img1 = img1.filter(ImageFilter.GaussianBlur(radius=30))
img_new.paste(img1,box=(0,0))
# print(int((img1.width-img.width)/2))
img_new.paste(img,box=(int((img1.width-img.width)/2),0))
img_new.save(pic_path)
img1.close()
img.close()
img_new.close()
if __name__ == '__main__':
end_list = ['.jpg','.JPG','.jpeg','.JPEG','.png','.PNG']
file_dir = r"G:\照片\旅行照片"
path_lists = []
for root, dirs, files in os.walk(file_dir):
#print(root) #当前目录路径
path_lists.append(dirs) #当前路径下所有子目录
#print(files) #当前路径下所有非目录子文件
path_list = path_lists[0]
for path in path_list:
floder_path = file_dir + '\\' +path
file_list = os.listdir(floder_path)
im_list = []
for f in file_list:
# print(f)
f_end = f'.{f.split(".")[-1]}'
# print(f_end)
if f_end in end_list:
pic_path = floder_path + '\\' + f
print(pic_path)
deal_pic(pic_path)
3.原本打算用自带的程序进行桌面切换,但是照片文件太多,win10直接读不出来那么多图片,也可能需要把所有照片放到同一目录下,不便后期管理,所以决定将所有照片文件目录保存在json文件中,用python程序随机提取照片设为桌面,这样还可以自主控制桌面切换的时间。
import os
import json
from os import listdir
from PIL import Image, ImageOps,ImageFilter,ImageFile
ImageFile.LOAD_TRUNCATED_IMAGES = True
#导入了上边代码解决OSError: broken data stream when reading image file报错
if __name__ == '__main__':
# end_list = ['.jpg','.JPG','.jpeg','.JPEG','.png','.PNG']
# file_dir = r"G:\照片\旅行照片"
# path_lists = []
# for root, dirs, files in os.walk(file_dir):
# #print(root) #当前目录路径
# path_lists.append(dirs) #当前路径下所有子目录
# #print(files) #当前路径下所有非目录子文件
# path_list = path_lists[0]
# pic_list = []
# for path in path_list:
# floder_path = file_dir + '\\' +path
# file_list = os.listdir(floder_path)
# im_list = []
# for f in file_list:
# # print(f)
# f_end = f'.{f.split(".")[-1]}'
# # print(f_end)
# if f_end in end_list:
# pic_path = floder_path + '\\' + f
# print(pic_path)
# pic_list.append(pic_path)
# print(len(pic_list))
pic_data = 'pic.json'
# with open(pic_data,'w') as file_obj:
# json.dump(pic_list, file_obj)
with open(pic_data) as file_obj:
pic_list = json.load(file_obj)
print(pic_list[3])
设置桌面程序,可以设置成bat文件和后台运行文件 放到启动文件夹内自启动。
import json
import win32api # 调用Windows底层的接口
import win32con # 修改数据
import win32gui # 提交数据
import ctypes # os文件操作
import random # 取随机值
import time
def setWallpaperMode(mode_str):
reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)
win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, mode_str)
# 获取当前路径
def getWallpaper():
ubuf = ctypes.create_unicode_buffer(512)
ctypes.windll.user32.SystemParametersInfoW(win32con.SPI_GETDESKWALLPAPER, len(ubuf), ubuf, 0)
return ubuf.value
# 设置背景桌面为指定路径的图片
def setWallpaper(path):
changed = win32con.SPIF_UPDATEINIFILE | win32con.SPIF_SENDCHANGE
ctypes.windll.user32.SystemParametersInfoW(win32con.SPI_SETDESKWALLPAPER, 0, path, changed)
if __name__ == '__main__':
pic_data = 'pic.json'
with open(pic_data) as file_obj:
pic_list = json.load(file_obj)
while(1):
img_path = random.choice(pic_list)
setWallpaper(img_path)
# print(img_path)
time.sleep(20) #调整时间可以改变换图片的间隔