如何在Python中从Windows剪贴板读取jpg或png,并反向操作?

23 投票
4 回答
23721 浏览
提问于 2025-04-16 23:30

我在Windows的剪贴板上有一张图片(jpg、png等格式)。我想把它保存到一个文件里。win32clipboard这个库看起来可以解决这个问题,但我找到的每个例子都是关于文本的。

我先把一张图片复制到剪贴板,然后

import win32clipboard
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData()
with open(name, 'wb') as f:
    f.write(data)
win32clipboard.CloseClipboard()

结果失败,出现了

TypeError: Specified clipboard format is not available

我还想做反向操作——给定一张图片文件,把它写入剪贴板。

4 个回答

5

使用 PythonMagick (可以在这里找到安装包):

from PythonMagick import Image
Image("clipboard:").write("PNG32:clipboard.png")  # clipboard -> file
Image("clipboard.png").write("clipboard:")  # file -> clipboard
7

你需要给GetClipboardData这个函数传一个参数,告诉它你想要的数据格式。你可以用EnumClipboardFormats来查看有哪些可用的格式。比如,当我在资源管理器中复制东西时,有15种格式可以选择。

编辑 2:这是获取文件名的代码,前提是你在资源管理器中复制了一个文件。如果你是从程序里,比如浏览器,复制了一张图片,结果会完全不同。

import win32clipboard
win32clipboard.OpenClipboard()
filename_format = win32clipboard.RegisterClipboardFormat('FileName')
if win32clipboard.IsClipboardFormatAvailable(filename_format):
    input_filename = win32clipboard.GetClipboardData(filename_format)
win32clipboard.CloseClipboard()

编辑 3:从评论来看,你的剪贴板里实际上有一张图片,而不是图片文件的文件名。你提到不能使用PIL库,所以:

import win32clipboard
win32clipboard.OpenClipboard()
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_DIB):
    data = win32clipboard.GetClipboardData(win32clipboard.CF_DIB)
win32clipboard.CloseClipboard()

此时你手里有一个字符串(在Python 2中)或字节(在Python 3中),里面包含了图片数据。你能保存的唯一格式是.BMP,而且你需要解码BITMAPINFOHEADER,以获取需要写入文件开头的BITMAPFILEHEADER的参数。

37

我建议你使用 Pillow 这个库:

from PIL import ImageGrab
im = ImageGrab.grabclipboard()
im.save('somefile.png','PNG')

撰写回答