🈹Win11多屏壁纸切割程序
00 分钟
2024-10-9
2024-10-9
type
status
date
slug
summary
tags
category
icon
password
🧑‍💻
在我的工位上,有多块屏幕,横屏又竖屏。 屏幕是用爽了,但是有时候总找不到合适的壁纸,让这些屏幕连贯起来。 于是便有了这个想法

😧 我的痛点

首先,我的工作环境需要多块屏幕,我也适应了多屏幕的工作节奏。
其次,目前的工位上,我没办法把两块屏幕同时横屏放置,也用不了那种带鱼屏超长壁纸。
最后,我最下面的那块屏幕实际上是一块平板电脑,通过spacedesk有线连接,可能会随需要进行拆装。
因此,如前言部分写的,我一直想找到一个办法,让每一块屏幕的桌面壁纸,达到一个和谐统一且美观好看的程度。

🔎 思考探索

探索1:填充

首先,按照传统思路,我在设置界面打开”个性化”—>”背景”选项,然后选择一张我想要的壁纸,适应模式选择“填充”。
notion image
这种设置将得到以下效果:
notion image
可以看到,主屏幕和第三块副屏因为其16:9的比例,能完美显示图片。
但是,旁边的竖屏,在win11的填充算法下,只得到了“一半”房子,而且最大的两块屏幕之间割裂感非常强。
有同学就会说了,那我给每块屏幕设置不同的壁纸不就完了吗?
不得不说,这是个好办法,但是我是个懒人,也不是二次元,没有那种动漫人物的壁纸同时可以放在横屏和竖屏里的。我也不愿意花时间去找,还是更喜欢风景画做壁纸一点。

探索2:跨区

偶然间,我发现win11在壁纸适应模式里面,有一个“跨区”选项,这可有意思了。
notion image
notion image
这个选项有什么魔力呢,就是说,它可以把你选定的壁纸,按照当前屏幕的布局(即在显示设置中的屏幕位置关系),来自动裁剪你的壁纸,达到一个连贯的水平。
这感情好啊,我马上试一试,但怎么说呢,emmm,看图↓
notion image
在只有上面两块屏幕的情况下,跨区选项很完美,能让我看到我的壁纸上的那条“乡间小路”贯穿两块屏幕。
但是一旦我加上了下面这第三款屏幕,因为分辨率的关系,我这三块屏幕参数如下:
  • 屏幕1:3840x2160
  • 屏幕2:1440x2560(VSR超分到2160x3840)
  • 屏幕3:3048x2032(使用spacedesk获取屏幕原生像素)
但是,明显最下面这块屏幕的ppi是最高最精细的,在显示设置里实际的大小与相对位置观感也和现实中有差距。
所以就导致了,上面这个更怪异的“跨区”效果。

👨‍💻 壁纸切割程序开发

于是乎,干脆一不做二不休,不就是根据屏幕当前位置,来裁剪出合适的壁纸嘛,我自己写一个程序不就完了!
花费了半天时间,在ChatGPT的辅助下,我终于完成了这个壁纸切割程序!

MultiScreenImage.py程序(折叠中可打开)

这段程序的工作原理如下:
  1. 通过win32api.EnumDisplayMonitors()方法,获取当前屏幕的空间位置(其实就是你在显示设置里拖拽的页面的坐标数据),其实就是几个矩形的坐标。
  1. 计算得出一个能包围所有矩形的最小矩形,作为包围矩形
  1. 获取目标壁纸图片的长宽数据,作为背景矩形
  1. 将包围矩形缩放调整到与背景矩形 居中,填充
  1. 等比缩放原有矩形坐标,并在壁纸图片上根据坐标进行切割,生成新的壁纸
  1. 使用win32gui接口,自动将切割好的壁纸,依序设置为各个屏幕的桌面(有bug)
在这个过程中,为了直观预览,我特意添加了plot绘图,在plot中先预览切割效果。
同时为了方便,还将输入壁纸改为了参数输入,这样只需要将这个python程序拷贝到你平常存放壁纸的文件夹下,使用一行命令即可运行得到裁剪好的图片了。
程序运行截图如下:
notion image
甚至我个人感觉,这个程序的壁纸裁剪逻辑,跟win11自带的“跨区”功能裁剪出来的壁纸,一模一样。

🎊 实际部署

有了这个程序,我就能按照自己的想法,切割出壁纸,搭配出好看的桌面啦。
①我首先在只有两块屏幕的情况下,运行这个程序,将壁纸裁剪为一横一竖两个部分。
notion image
②在桌面生成两个图片文件:
notion image
 
③然后分别设置这两个图片为壁纸,接着在个性化页面找到“最近使用的图片”,右键即可单独给监视器设置壁纸
notion image
④这几个图片的适应模式都选择“填充”,然后再接上第三块屏幕,用同样的办法设置壁纸,就大功告成啦!
这就是我调整后的桌面壁纸,我拔掉第三块屏幕也不影响上面两块屏幕的壁纸排布,真是赏心悦目!
notion image

🤗 总结

总结来说,这是一个简单的项目,但确实能够解决实际痛点,而且这个方法应该也可以推广给有同样需求的人。
在程序创作上来说,思路也比较简单,最多也就是矩形坐标的换算,没有什么难度。
从用户交互逻辑上,还有提升的空间,比方说还可以做成可交互拖动的壁纸裁剪等。
但是程序仍然有一些不足,比如page.crop()这个方法切割出来的图片有可能出现“大小膨胀”,原图10M,裁剪出来的图却有20M,暂时没有找到原因,过大的图片是不能够被设置为win11的壁纸的,会直接黑掉。
最后想说一下,有了大模型的辅助,在这种api检索和代码生成上,真的提高了不少效率,点赞!
 
🫰
希望这篇文章,这个代码,能帮到你!
 
上一篇
开源协议总结归纳
下一篇
情侣自律打卡小程序