如何在Python中从Windows剪贴板读取jpg或png,并反向操作?
我在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')