我在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
我也想反过来 - 给定一个图像文件,将其写入剪贴板。
答案 0 :(得分:22)
我只想使用Pillow:
from PIL import ImageGrab
im = ImageGrab.grabclipboard()
im.save('somefile.png','PNG')
答案 1 :(得分:5)
您需要将参数传递给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的参数。
答案 2 :(得分:4)
函数win32clipboard.GetClipboardData()
有一个参数。 default参数指定您希望剪贴板的内容为文本。您需要传入指定希望剪贴板为您提供的数据格式的值。
标准剪贴板数据格式记录为here。
同时强>
有关EnumClipboardFormats()
的文档,请参阅here - 基本上,您需要像(未经测试)这样的代码来获取剪贴板上当前可用的格式:
formats = []
lastFormat = 0
while 1:
nextFormat = win32clipboard.EnumClipboardFormats(lastFormat)
if 0 == nextFormat:
# all done -- get out of the loop
break
else:
formats.append(nextFormat)
lastFormat = nextFormat
# when you get here, formats contains a list of format codes that
# you can retrieve from the clipboard right now.
答案 3 :(得分:2)
使用PythonMagick(binaries):
from PythonMagick import Image
Image("clipboard:").write("PNG32:clipboard.png") # clipboard -> file
Image("clipboard.png").write("clipboard:") # file -> clipboard