×××复习阶段,无聊弄点东西玩一下,实现功能有(控制浏览器访问学校校历,截图保存下来,通过图片处理,最终将其设置为桌面):

    1.控制浏览器访问网页;

    2.将网页截图;

    3.图片处理(图片合并、图片换色);

    4.调用win32Api,将图片设置为壁纸;

    5.py脚本转exe可执行程序;

    6.获取鼠标所在位置的xy值和RGB值。

 所编写内容均来自互联网,下面进行记录(完整的代码放到http://188.131.140.135/softwareList/Mine/):


一、获取网页截图与环境配置(所有安装的包如图所示)

    下面不再赘述包的安装,如果报错,可以使用pip安装对应的包

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;

    可以到http://188.131.140.135/softwareList/ 下载不好找的包和ChromeDriver(用于控制谷歌浏览器的驱动)(对应的是Chrome最新的版本)

        ChromeDriver不需要安装,只要放到谷歌浏览器的安装目录下即可,默认是:C:\Program Files (x86)\Google\Chrome\Application下

            然后修改一下系统变量,如下图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_02

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_03

        接下来就可以通过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的截图了,如下图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_04

二、对获取到的截图进行处理

    上面获取到的这个图片并不能直接用来做桌面,所以需要进行裁剪,将中间显示日历的部分裁剪出来,使用到的包是上边已经导过的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,如下图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_05

    在截取之后,可以直接将其设置为桌面背景,但是不太好看,所以可以通过win10自带的绘图软件自己绘制一个背景图片,将其命名为base.png,如下图所示(随便画):

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_06

    制作好了背景图之后,就可以将两张图片进行拼合,过程是将截图缩小,然后粘贴到背景图上,代码如下所示:

#加载底图
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如下图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_07

    到了这一步,已经可以将其设置为桌面了,但是通过实际的尝试体验之后,发现白色背景的桌面是真的难看,而且还和桌面上的文件名的颜色有冲突,导致文件名看不清,所以下面将此图片修改一下颜色,例如可以修改为浅×××,代码如下:

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")#保存修改像素点后的图片

    保存后的效果如下图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_08


三、设为桌面壁纸

    当调出了一张比较满意的壁纸之后,就可以通过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') #地址要写绝对地址,否则设置完之后,桌面会是一片灰色,同理,如果设置完之后,桌面是什么都没有的灰色,那就说明设置失败了,代码有问题

        设置完成之后的效果如下图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_09

    当设置完壁纸之后,工作就结束了,接下来要进行的是后续的清理工作,首先要将生成的几张图片删除掉,代码如下:

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中,如下图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_10

    这样就快速的切换到脚本保存目录中,通过“dir”命令就可以看到其中的Python脚本了,接下来通过命令来进行编译:

pyinstaller -F getSchoolCalenderAndSetBackground.py

        如图所示:

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_11

        当控制台输出这条消息之后,就代表已经编译成功了

python功能笔记——杂七杂八_浏览器控制;图像处理;Win32Api;_12

    然后回到文件夹中,就可以看到编译后的文件了,不过会同时生成很多没用的东西,真正的好东西在“dist”目录下,将这个目录中的".exe"文件取出,就可以运行了(需要注意的是,要在此exe运行的目录下放上之前使用到的“base.png”这个背景图片)