×××复习阶段,无聊弄点东西玩一下,实现功能有(控制浏览器访问学校校历,截图保存下来,通过图片处理,最终将其设置为桌面):
1.控制浏览器访问网页;
2.将网页截图;
3.图片处理(图片合并、图片换色);
4.调用win32Api,将图片设置为壁纸;
5.py脚本转exe可执行程序;
6.获取鼠标所在位置的xy值和RGB值。
所编写内容均来自互联网,下面进行记录(完整的代码放到http://188.131.140.135/softwareList/Mine/):
一、获取网页截图与环境配置(所有安装的包如图所示)
下面不再赘述包的安装,如果报错,可以使用pip安装对应的包
可以到http://188.131.140.135/softwareList/ 下载不好找的包和ChromeDriver(用于控制谷歌浏览器的驱动)(对应的是Chrome最新的版本)
ChromeDriver不需要安装,只要放到谷歌浏览器的安装目录下即可,默认是:C:\Program Files (x86)\Google\Chrome\Application下
然后修改一下系统变量,如下图所示:
接下来就可以通过selenium获取网页的截图了,参考代码如下(来自于互联网):
from selenium import webdriver from PIL import Image import os #引入chromedriver.exe option = webdriver.ChromeOptions()#引入参数 #option.add_argument('headless')#屏蔽浏览器显示,效果是不打开浏览器就实现功能,但是为了截图,还是要打开比较好 chromedriver = "chromedriver.exe" os.environ["webdriver.chrome.driver"] = chromedriver browser = webdriver.Chrome(chromedriver,chrome_options=option) #设置浏览器需要打开的url url = "http://202.206.243.9/xiaoli.asp" browser.maximize_window()#将浏览器窗口最大化 browser.get(url) browser.execute_script(""" (function () { var y = 50; var step = 100; window.scroll(0, 0); function f() { if (y < document.body.scrollHeight) { y += step; window.scroll(0, y); setTimeout(f, 50); } else { window.scroll(0, 0); document.title += "scroll-done"; } } setTimeout(f, 1000); })(); """)#执行截图脚本 for i in range(30): if "scroll-done" in browser.title: break time.sleep(1) browser.save_screenshot("schoolCalenderSource.png")#将截图保存 browser.close()#关闭浏览器 browser.quit()#关闭Chrome Driver
如果一切顺利的话,就可以在当前目录下得到一张名为schoolCalenderSource.png的截图了,如下图所示:
二、对获取到的截图进行处理
上面获取到的这个图片并不能直接用来做桌面,所以需要进行裁剪,将中间显示日历的部分裁剪出来,使用到的包是上边已经导过的PIL(通过安装Pillow),代码如下:
im = Image.open("schoolCalenderSource.png") # 图片的宽度和高度 img_size = im.size x = 400 y = 260 w = 1100 h = 570 region = im.crop((x, y, x+w, y+h)) #在这里可以多试几次,以裁出一个最合适的大小 region.save("./schoolCalenderBeCut.png")
裁取后将图片保存为schoolCalenderBeCut.png,如下图所示:
在截取之后,可以直接将其设置为桌面背景,但是不太好看,所以可以通过win10自带的绘图软件自己绘制一个背景图片,将其命名为base.png,如下图所示(随便画):
制作好了背景图之后,就可以将两张图片进行拼合,过程是将截图缩小,然后粘贴到背景图上,代码如下所示:
#加载底图 base_img = Image.open('base.png') base_img = base_img.resize((1920,1600)) # 可以查看图片的size和mode,常见mode有RGB和RGBA,RGBA比RGB多了Alpha透明度 # print base_img.size, base_img.mode box = (500, 600, 1600, 1170) # 底图上需要P掉的区域,这些数字通过自己来多次尝试,才能试出一个合适的数字 #1100 570 #加载需要P上去的图片 tmp_img = Image.open('schoolCalenderBeCut.png') #这里可以选择一块区域或者整张图片 #region = tmp_img.crop((0,0,304,546)) #选择一块区域 #或者使用整张图片 region = tmp_img #使用 paste(region, box) 方法将图片粘贴到另一种图片上去. # 注意,region的大小必须和box的大小完全匹配。但是两张图片的mode可以不同,合并的时候回自动转化。如果需要保留透明度,则使用RGMA mode #提前将图片进行缩放,以适应box区域大小 # region = region.rotate(180) #对图片进行旋转 region = region.resize((box[2] - box[0], box[3] - box[1])) base_img.paste(region, box) #base_img.show() # 查看合成的图片 base_img.save('./schoolCalenderBeCombine.png') #保存图片
保存的图片schoolCalenderBeCombine.png如下图所示:
到了这一步,已经可以将其设置为桌面了,但是通过实际的尝试体验之后,发现白色背景的桌面是真的难看,而且还和桌面上的文件名的颜色有冲突,导致文件名看不清,所以下面将此图片修改一下颜色,例如可以修改为浅×××,代码如下:
img = Image.open("schoolCalenderBeCombine.png")#读取图片 width = img.size[0]#长度 height = img.size[1]#宽度 i = 1 j = 1 for i in range(0,width):#遍历所有长度的点 for j in range(0,height):#遍历所有宽度的点 data = (img.getpixel((i,j)))#打印该图片的所有点 if (data[0]>=220 and data[1]>=220 and data[2]>=220):#RGBA的r值大于170,并且g值大于170,并且b值大于170 img.putpixel((i,j),(230,228,205,20))#则这些像素点的颜色改色 #############下面的几行代码是在×××的日期#12月22号#处画个方块############## x=1050 y=715 #每个32 color=(241,148,148,255) if (j>=x and j<=x+35):#真实+260[1050,1060] if(i>=y and i<= y+10):#[715,725] img.putpixel((i,j),color) if (j>=x and j<=x+10):#真实+260[1050,1060] if(i>=y and i<= y+30):#[715,725] img.putpixel((i,j),color) if (j>=x+25 and j<=x+35):#真实+260[1050,1060] if(i>=y and i<= y+30):#[715,725] img.putpixel((i,j),color) if (j>=x and j<=x+35):#真实+260[1050,1060] if(i>=y+30 and i<= y+40):#[715,725] img.putpixel((i,j),color) #############到这里结束############## img = img.convert("RGB")#把图片强制转成RGB img.save("schoolCalenderColorChange.png")#保存修改像素点后的图片
保存后的效果如下图所示:
三、设为桌面壁纸
当调出了一张比较满意的壁纸之后,就可以通过Windows的api来进行控制(需要安装的包是pywin32),通过下面的代码(只需要改调用函数时传入的图片地址即可)来进行桌面壁纸的设置(详细的API可以自行去搜):
def setWallpaper( bmp ): import win32api, win32con, win32gui k = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE) win32api.RegSetValueEx(k, "WallpaperStyle", 0, win32con.REG_SZ, "0") win32api.RegSetValueEx(k, "TileWallpaper", 0, win32con.REG_SZ, "0") win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, bmp, 1+2) setWallpaper(os.getcwd()+'\\schoolCalenderColorChange.png') #地址要写绝对地址,否则设置完之后,桌面会是一片灰色,同理,如果设置完之后,桌面是什么都没有的灰色,那就说明设置失败了,代码有问题
设置完成之后的效果如下图所示:
当设置完壁纸之后,工作就结束了,接下来要进行的是后续的清理工作,首先要将生成的几张图片删除掉,代码如下:
os.remove('schoolCalenderSource.png') os.remove('schoolCalenderBeCut.png') os.remove('schoolCalenderBeCombine.png') os.remove('schoolCalenderColorChange.png')
当然,还可以修改代码,将所有图片存在内存中,不用非得保存在硬盘上,但是由于我为了看每一步的效果才这么做的,以后有时间再进行完善吧!
四、Python脚本转为EXE可执行文件
这一步很简单,需要用到的包为PyInstaller,直接使用pip进行安装即可(pip install pyinstaller)
这一步需要在python shell中完成,首先将已经编写好的Python脚本单独放到一个文件夹中(因为接下来的操作会生成很多的目录和文件,很可能就不知道那些是原来存在的,那些是生成的没用的),现在我的这个文件在桌面上,接下来打开CMD(WIN+R),先打个“cd ”然后将这个文件拖到CMD中,如下图所示:
这样就快速的切换到脚本保存目录中,通过“dir”命令就可以看到其中的Python脚本了,接下来通过命令来进行编译:
pyinstaller -F getSchoolCalenderAndSetBackground.py
如图所示:
当控制台输出这条消息之后,就代表已经编译成功了
然后回到文件夹中,就可以看到编译后的文件了,不过会同时生成很多没用的东西,真正的好东西在“dist”目录下,将这个目录中的".exe"文件取出,就可以运行了(需要注意的是,要在此exe运行的目录下放上之前使用到的“base.png”这个背景图片)