如何从python中的Windows剪贴板中读取jpg或png,反之亦然?

时间:2011-08-12 19:19:57

标签: python pywin32

我在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 个答案:

答案 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)

使用PythonMagickbinaries):

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