win32api 如何截屏保存为png或者jpg?

新手上路,请多包涵
# 截取屏幕
def get_screen(name='mysc.bmp'):
     # 获取桌面
    hdesktop = win32gui.GetDesktopWindow()
    # 分辨率适应
    width = win32api.GetSystemMetrics(win32con.SM_CXVIRTUALSCREEN)
    height = win32api.GetSystemMetrics(win32con.SM_CYVIRTUALSCREEN)
    left = win32api.GetSystemMetrics(win32con.SM_XVIRTUALSCREEN)
    top = win32api.GetSystemMetrics(win32con.SM_YVIRTUALSCREEN)
    # 创建设备描述表
    desktop_dc = win32gui.GetWindowDC(hdesktop)
    img_dc = win32ui.CreateDCFromHandle(desktop_dc)
    # 创建一个内存设备描述表
    mem_dc = img_dc.CreateCompatibleDC()
    # 创建位图对象 screenshot = bmp 
    screenshot = win32ui.CreateBitmap()
    screenshot.CreateCompatibleBitmap(img_dc, width, height)
    mem_dc.SelectObject(screenshot)
    # 截图至内存设备描述表
    mem_dc.BitBlt((0, 0), (width, height), img_dc, (0, 0), win32con.SRCCOPY)
    # 将截图保存到文件中
    screenshot.SaveBitmapFile(mem_dc, name)
    # # 内存释放
    mem_dc.DeleteDC()
    win32gui.DeleteObject(screenshot.GetHandle())

保存下来的是bmp,太大了啊

阅读 4.8k
1 个回答

你都拿到 Bitmap 了,用 PIL 转成 JPG 再保存不就好啦?顶多牺牲一下内存占用。


很多 Win32 API 都继承自上古时代的 Windows 95 甚至更早的 Windows 3.0,这是个 1990 年就推出的操作系统;而 JPEG 格式标准在 1992 年才推出、PNG 格式标准更是 1996 年才制定出来,所以早期的 Win32 API 根本没考虑其他图片格式。

当然更重要的一点是,BMP 是微软主导制定的格式标准,当然微软优先支持它了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题