615961414 发表于 2022-5-8 06:41:57

python如何获取windows剪切板中的截图

在使用截图以后,系统会将截图加入到剪切板中,python如何获取剪切板中的截图了?
目前发现可以使用
win32clipboard.GetClipboardData(win32con.CF_BITMAP)# 估计是获取截图内存地址
win32clipboard.GetClipboardData(win32con.DIB) # 应该是截图的内容,但是与本地存储的二进制图片数据不一致。
求助具体获得的方式

wp231957 发表于 2022-5-8 07:40:47

from PIL import Image, ImageGrab

im = ImageGrab.grabclipboard()

if isinstance(im, Image.Image):
    print "Image: size : %s, mode: %s" % (im.size, im.mode)
    im.save("D:\\Document\\mdoc\\python\\pic\\12\\grab_grabclipboard.jpg")
elif im:
    for filename in im:
      try:
            print "filename: %s" % filename
            im = Image.open(filename)
      except IOError:
            pass #ignore this file
      else:
            print "ImageList: size : %s, mode: %s" % (im.size, im.mode)
else:
    print "clipboard is empty."

wp231957 发表于 2022-5-8 07:41:41

wp231957 发表于 2022-5-8 07:40
from PIL import Image, ImageGrab

im = ImageGrab.grabclipboard()


网上搜的,不知道能不能用

hrpzcf 发表于 2022-5-8 13:01:11

没有现成的api将位图信息保存为文件,要保存为文件还是比较麻烦的,你还是直接用现成的库吧。

615961414 发表于 2022-5-8 18:36:53

wp231957 发表于 2022-5-8 07:41
网上搜的,不知道能不能用

谢谢,可以用的,我后面我也搜到这个了,还有一种方法用win32API也可以就是要加结构体和头文件过程特别麻烦。测试过也可以用。代码如下:
import ctypes
from ctypes.wintypes import *
import win32clipboard
from win32con import *
import sys
class BITMAPFILEHEADER(ctypes.Structure):
    _pack_ = 1# structure field byte alignment
    _fields_ = [
      ('bfType', WORD),# file type ("BM")
      ('bfSize', DWORD),# file size in bytes
      ('bfReserved1', WORD),# must be zero
      ('bfReserved2', WORD),# must be zero
      ('bfOffBits', DWORD),# byte offset to the pixel array
    ]
SIZEOF_BITMAPFILEHEADER = ctypes.sizeof(BITMAPFILEHEADER)
class BITMAPINFOHEADER(ctypes.Structure):
    _pack_ = 1# structure field byte alignment
    _fields_ = [
      ('biSize', DWORD),
      ('biWidth', LONG),
      ('biHeight', LONG),
      ('biPLanes', WORD),
      ('biBitCount', WORD),
      ('biCompression', DWORD),
      ('biSizeImage', DWORD),
      ('biXPelsPerMeter', LONG),
      ('biYPelsPerMeter', LONG),
      ('biClrUsed', DWORD),
      ('biClrImportant', DWORD)
    ]
SIZEOF_BITMAPINFOHEADER = ctypes.sizeof(BITMAPINFOHEADER)
win32clipboard.OpenClipboard()
try:
    if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_DIB):
      data = win32clipboard.GetClipboardData(win32clipboard.CF_DIB)
    else:
      print('clipboard does not contain an image in DIB format')
      sys.exit(1)
finally:
    win32clipboard.CloseClipboard()
bmih = BITMAPINFOHEADER()
ctypes.memmove(ctypes.pointer(bmih), data, SIZEOF_BITMAPINFOHEADER)
if bmih.biCompression != BI_BITFIELDS:# RGBA?
    print('insupported compression type {}'.format(bmih.biCompression))
    sys.exit(1)
bmfh = BITMAPFILEHEADER()
ctypes.memset(ctypes.pointer(bmfh), 0, SIZEOF_BITMAPFILEHEADER)# zero structure
bmfh.bfType = ord('B') | (ord('M') << 8)
bmfh.bfSize = SIZEOF_BITMAPFILEHEADER + len(data)# file size
SIZEOF_COLORTABLE = 0
bmfh.bfOffBits = SIZEOF_BITMAPFILEHEADER + SIZEOF_BITMAPINFOHEADER + SIZEOF_COLORTABLE
bmp_filename = 'clipboard.bmp'
with open(bmp_filename, 'wb') as bmp_file:
    bmp_file.write(bmfh)
    bmp_file.write(data)
print('file "{}" created from clipboard image'.format(bmp_filename))

615961414 发表于 2022-5-8 18:37:47

wp231957 发表于 2022-5-8 07:40
from PIL import Image, ImageGrab

im = ImageGrab.grabclipboard()


谢谢

615961414 发表于 2022-5-8 18:38:18

hrpzcf 发表于 2022-5-8 13:01
没有现成的api将位图信息保存为文件,要保存为文件还是比较麻烦的,你还是直接用现成的库吧。

楼上的两位的可以使用。
页: [1]
查看完整版本: python如何获取windows剪切板中的截图