Python截屏及其它图片处理操作

调用系统API

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
import time
import win32gui, win32ui, win32con, win32api


def window_capture(filename):
hwnd = 0 # 窗口的编号,0号表示当前活跃窗口
# 根据窗口句柄获取窗口的设备上下文DC(Divice Context)
hwndDC = win32gui.GetWindowDC(hwnd)
# 根据窗口的DC获取mfcDC
mfcDC = win32ui.CreateDCFromHandle(hwndDC)
# mfcDC创建可兼容的DC
saveDC = mfcDC.CreateCompatibleDC()
# 创建bigmap准备保存图片
saveBitMap = win32ui.CreateBitmap()
# 获取监控器信息
MoniterDev = win32api.EnumDisplayMonitors(None, None)
w = MoniterDev[0][2][2]
h = MoniterDev[0][2][3]
# 为bitmap开辟空间
saveBitMap.CreateCompatibleBitmap(mfcDC, w, h)
# 高度saveDC,将截图保存到saveBitmap中
saveDC.SelectObject(saveBitMap)
# 截取从左上角(0,0)长宽为(w,h)的图片
saveDC.BitBlt((0, 0), (w, h), mfcDC, (0, 0), win32con.SRCCOPY)
saveBitMap.SaveBitmapFile(saveDC, filename)


if __name__ == '__main__':
beg = time.time()
for i in range(10):
window_capture("test.jpg")
end = time.time()
print(end - beg)

截图10次的时间

0.3241748809814453

这种方式截图速度最快,图片较大

PIL

PIL截图

引用

1
pip install pillow

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import time

from PIL import ImageGrab

def screenshot(filename):
img = ImageGrab.grab()
img.save(filename,'JPEG')

def screenshot2(filename):
# 区域截图
img = ImageGrab.grab(bbox=(0, 0, 960, 540))
img.save(filename, 'JPEG')

if __name__ == '__main__':
beg = time.time()
for i in range(10):
screenshot("test.jpg")
end = time.time()
print(end - beg)

截图10次的时间

0.41718339920043945

这种方式截图会稍慢,但是截图是压缩后的,图片大小较小。

图片属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 1.图片加载与图片属性
from PIL import Image
im = Image.open('./jinzhengen.png')

# format属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None;
print(im.format) # 'PNG'

# size属性是一个tuple,表示图像的宽和高(单位为像素)
print(im.size) # (411, 273)

# mode属性为表示图像的模式,常用的模式为:L为灰度图,RGB为真彩色,CMYK为pre-press图像。
print(im.mode) # 'RGB'

# 2.另存为
im.save('./123.jpg')

本地程序打开图片

1
2
3
from PIL import Image
im = Image.open('test.jpg')
im.show()

图片灰度

1
2
3
4
from PIL import Image
im = Image.open('test.jpg')
L = im.convert('L')
L.show()

图片滤镜

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 4.图片的滤镜
from PIL import Image, ImageFilter
im = Image.open('./test.png')

# im.filter(ImageFilter.GaussianBlur) # 高斯模糊 =>画圈取平均值
# im.filter(ImageFilter.BLUR) # 普通模糊
# im.filter(ImageFilter.EDGE_ENHANCE) # 边缘增强
# im.filter(ImageFilter.FIND_EDGES) # 找到边缘
# im.filter(ImageFilter.EMBOSS) # 浮雕
# im.filter(ImageFilter.CONTOUR) # 轮廓
# im.filter(ImageFilter.SHARPEN) # 锐化
# im.filter(ImageFilter.SMOOTH) # 平滑
# im.filter(ImageFilter.DETAIL) # 细节

imf = im.filter(ImageFilter.GaussianBlur)
imf.show()

图片裁剪及旋转

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from PIL import Image, ImageFilter 
im = Image.open('./test.png') # (411, 273)
box = (120, 194, 220, 294) #定义裁剪区域 => 左上角与右下角两个坐标
region = im.crop(box) #裁剪
display(region)

# transpose 旋转指定角度
# 参数值
# Image.ROTATE_90、Image.ROTATE_180、Image.ROTATE_270
# Image.FLIP_LEFT_RIGHT(#左右对换), Image.FLIP_TOP_BOTTOM(上下对换)
im.transpose(Image.FLIP_TOP_BOTTOM) # 图片旋转,旋转指定角度

# rotate 旋转随意角度
im.rotate(45) # 旋转随意角度

图像缩放

1
2
3
from PIL import Image, ImageFilter 
im = Image.open('./test.png') # (411, 273)
im.resize((200,100)) # #参数表示图像的新尺寸,分别表示宽度和高度

图像对比度增强

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
# 8.图像对比度增强
from PIL import Image, ImageEnhance
im = Image.open('./test.png')

#亮度增强
# enh_bri = ImageEnhance.Brightness(im)
# brightness = 1.5
# image_brightened = enh_bri.enhance(brightness)
# image_brightened

# #色度增强
# enh_col = ImageEnhance.Color(im)
# color = 1.5 # 此值没有任何限制
# image_colored = enh_col.enhance(color)
# image_colored

# #对比度增强
enh_con = ImageEnhance.Contrast(im)
contrast = 1.5
image_contrasted = enh_con.enhance(contrast)
image_contrasted

# #锐度增强
# enh_sha = ImageEnhance.Sharpness(im)
# sharpness = 3.0
# image_sharped = enh_sha.enhance(sharpness)
# image_sharped

GIF处理

1
2
3
4
5
6
7
# 9.gif图像处理
from PIL import Image
im = Image.open('./test.gif') # (411, 273)
display(im.format, im.size, im.mode) # 'GIF',(800, 600) 'P'=>帧

im.seek(1) # 定位到第几帧
im.tell() # 返回当前帧所处位置