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

2021-11-22 10:05:31 浏览数 (1)

调用系统API

代码语言:javascript复制
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截图

引用

代码语言:javascript复制
pip install pillow

代码

代码语言:javascript复制
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

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

图片属性

代码语言:javascript复制
# 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')

本地程序打开图片

代码语言:javascript复制
from PIL import Image
im = Image.open('test.jpg')
im.show()

图片灰度

代码语言:javascript复制
from PIL import Image
im = Image.open('test.jpg')
L = im.convert('L')
L.show()

图片滤镜

代码语言:javascript复制
# 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()

图片裁剪及旋转

代码语言:javascript复制
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)  # 旋转随意角度

图像缩放

代码语言:javascript复制
from PIL import Image, ImageFilter 
im = Image.open('./test.png')   # (411, 273)
im.resize((200,100))  # #参数表示图像的新尺寸,分别表示宽度和高度

图像对比度增强

代码语言:javascript复制
# 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处理

代码语言:javascript复制
# 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()  # 返回当前帧所处位置

0 人点赞