背景:windows 可以右键为不同的显示器设置不同的壁纸(需要先关闭虚拟桌面)。但是 slideshow 的不支持多个屏幕。
目前看这个问题是没有官方的方案的,理论上有一个收费软件可以解决,或者用*版,但是不想给钱还是有点麻烦。这里给一个解决方案是,直接暴力生成多张图片做 Span 方案。
思路示例图:
然后用 python 生成图片好了。
这里用 4K 图片,然后 ABC 显示器分别是 4K 垂直,4K水平 和 1080p 。然后匹配 4K 垂直图片、4K水平图片为例。代码有点不符合规范,但是讲解易懂,这里就不解释了。需要解释可以去问一下 ChatGPT。
有一些方案是做 cv2 的 copyTo。但是那个掩码和 ROI 搞得真麻烦,这里不需要通用的代码,需要的时候手动改一下数值就差不多得了。
import cv2
import numpy as np
def to169(img1, h):
return img1[img1.shape[0] - h:img1.shape[0], :]
def do(img1, img2, img3):
img = np.zeros((3840, 7920, 3), np.uint8) * 255
img1 = to169(img1, 3840)
img2 = to169(img2, 2160)
img3 = to169(img3, 2160)
img[0:3840, 0:2160] = img1
img[0:2160, 2160:2160 + 3840] = img2
img[0 + 2160 - 1080:0 + 2160,
2160 + 3840:2160 + 3840 + 1920] = cv2.resize(img3, (1920, 1080))
return img
def doName(a, b, c):
a = cv2.imread(a)
b = cv2.imread(b)
c = cv2.imread(c)
return do(a, b, c)
j = 0
for icha in range(1, 5):
ichanm = f"img0{icha}.jpg"
for i in range(0, 4):
iball1 = f"img{20+i}.jpg"
iball2 = f"img{20 + ((i+1)%4)}.jpg"
j += 1
cv2.imwrite(f"res/tripple_{j}.jpg", doName(ichanm, iball1, iball2))
完。
然后感觉可以写一个GUI软件封装一下。毕竟这个思路还是挺好的。需要做的步骤是:
a. 用 pyqt 写一个 GUI,调用 powershell 同步 Windows 的多显示器 layout:
layout 获取 Ref:
(3) Get relative positioning of monitors : PowerShell (reddit.com)bbhttps://www.reddit.com/r/PowerShell/comments/6qqagj/get_relative_positioning_of_monitors/b. 重构上面的 cv2 写一个通用的函数封装
c。pyqt,支持用户上传多个幻灯片专辑(原文就是 album)和绑定显示器(然后生成另一个文件夹真实的 span 图片)
d. 调用 powershell 切换壁纸专辑。
有几个值得注意的问题:
1. 是否支持各个屏幕单独配置时间?也可以解决,算一下再生成就行了就行了。
2. 是否支持文件夹(专辑)跟新?也可以解决,用 ntfs 的文件跟踪,搞个定时后台服务就行。 。。或者用 powershell 再配个定时计划任务程序把
3. 。。。
有兴趣的去找 chatGPT 把这个软件实现出来吧。