用Python提取Win10聚焦壁纸


设置 -> 锁屏界面 -> 背景 -> Windows 聚焦

能够更换精美的高清壁纸图片

可以通过Python保存

编写脚本文件

通过 Win + R 组合键,调出运行框,直接复制:

%localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets

敲回车,可以打开默认的聚焦背景图片的保存地址,这里的图片文件无后缀名,加上.jpg后缀即可显示图片。

写了一个脚本,自动将该目录下的文件保存到自己定义的目录,加上后缀名并且分类(分为横屏背景和竖屏背景).

需要 python3.6、opencv3:

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
import cv2
import os
import shutil

# 聚焦背景图片保存路径:
# %localappdata%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets

local_app_data_path = os.getenv('localappdata')

bg_pictures_path = os.path.join(local_app_data_path,'Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets')

# 原始文件夹下的图片无后缀名
file_name_list = os.listdir(bg_pictures_path)

# 复制到自己的文件夹中,添加后缀名
copy_dir = r'I:\BG_pictures\unclassified'

for file_name in file_name_list:
origin_abs_path = os.path.join(bg_pictures_path, file_name)
dest_abs_path = os.path.join(copy_dir, file_name + '.jpg')
shutil.copy2(origin_abs_path, dest_abs_path)

# 对横屏 (1080x1920) 和竖屏 (1920x1080) 图片进行分类,分别放入复制图片目录同级的两个目录中
hor_dir = os.path.abspath(os.path.join(copy_dir, '..', 'horizontal'))
ver_dir = os.path.abspath(os.path.join(copy_dir, '..', 'vertical'))

for file_name in os.listdir(copy_dir):
file_abs_path = os.path.join(copy_dir, file_name)
img = cv2.imread(file_abs_path)

if img.shape[0] == 1080 and img.shape[1] == 1920:
classified_abs_path = os.path.join(hor_dir, file_name)
elif img.shape[0] == 1920 and img.shape[1] == 1080:
classified_abs_path = os.path.join(ver_dir, file_name)

shutil.copy2(file_abs_path, classified_abs_path)

注意用local_app_data_path = os.getenv('localappdata')获取不同用户名文件夹下的相同位置。

这里并没有将原始目录下的文件删除,会进行重复分类,图片不是很多的情况下不会产生多大影响(不会出现副本2、副本3的情况),图片非常多,对速度产生影响的情况下,可以增加重复判断。

不用opencv判断图片大小

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
47
48
49
50
51
52
53
54
55
56
57
58
59
# function from: 
# https://gitlab.com/danielgordon10/re3-tensorflow/blob/master/re3_utils/util/im_util.py

def get_image_size(fname):
import struct, imghdr, re, sys
'''Determine the image type of fhandle and return its size.
from draco'''

while True:
with open(fname, 'rb') as fhandle:
head = fhandle.read(32)
if len(head) != 32:
break
if imghdr.what(fname) == 'png':
check = struct.unpack('>i', head[4:8])[0]
if check != 0x0d0a1a0a:
break
width, height = struct.unpack('>ii', head[16:24])
elif imghdr.what(fname) == 'gif':
width, height = struct.unpack('<HH', head[6:10])
elif imghdr.what(fname) == 'jpeg':
try:
fhandle.seek(0) # Read 0xff next
size = 2
ftype = 0
while not 0xc0 <= ftype <= 0xcf:
fhandle.seek(size, 1)
byte = fhandle.read(1)
while ord(byte) == 0xff:
byte = fhandle.read(1)
ftype = ord(byte)
size = struct.unpack('>H', fhandle.read(2))[0] - 2
# We are at a SOFn block
fhandle.seek(1, 1) # Skip `precision' byte.
height, width = struct.unpack('>HH', fhandle.read(4))
except Exception: #IGNORE:W0703
break
elif imghdr.what(fname) == 'pgm':
header, width, height, maxval = re.search(
b"(^P5\s(?:\s*#.*[\r\n])*"
b"(\d+)\s(?:\s*#.*[\r\n])*"
b"(\d+)\s(?:\s*#.*[\r\n])*"
b"(\d+)\s(?:\s*#.*[\r\n]\s)*)", head).groups()
width = int(width)
height = int(height)
elif imghdr.what(fname) == 'bmp':
_, width, height, depth = re.search(
b"((\d+)\sx\s"
b"(\d+)\sx\s"
b"(\d+))", str).groups()
width = int(width)
height = int(height)
else:
break

return width, height

sys.stderr.write('can not get image size.')
raise SystemExit(1)

将原代码中的img = cv2.imread(file_abs_path)改为img = get_image_size(file_abs_path)即可。


----------over----------


文章标题:用Python提取Win10聚焦壁纸

文章作者:Ge垚

发布时间:2018年09月04日 - 14:09

最后更新:2019年01月02日 - 22:01

原始链接:http://geyao1995.com/extract_bg_pictures/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。