如何用PIL和win32clipboard将图像写入Windows剪贴板?
我想打开一个图片文件,然后把这张图片复制到Windows的剪贴板上。请问有没有办法解决这个问题:
import win32clipboard
from PIL import Image
def send_to_clipboard(clip_type, data):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(clip_type, data)
win32clipboard.CloseClipboard()
clip_type = win32clipboard.CF_BITMAP
filepath = 'c:\\temp\\image.jpg'
im = Image.open(filepath)
data = im.tobitmap() # fails with valueerror: not a bitmap
# data = im.tostring() runs, but receiving programs can't read the results
send_to_clipboard(clip_type, data)
我可以安装PythonMagick等库,但我更希望不再为这个一次性的程序安装额外的库。
4 个回答
1
这个在我使用Python 3.8的时候有效(解决方案在这里找到)
这个答案和cgohike的答案是一样的,不过:
output = StringIO()
改成了:
output = io.BytesIO()
完整代码:
import io
import win32clipboard
from PIL import Image
def send_to_clipboard(clip_type, data):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(clip_type, data)
win32clipboard.CloseClipboard()
image = Image.open('image.jpg')
output = io.BytesIO()
image.convert("RGB").save(output, "BMP")
data = output.getvalue()[14:]
output.close()
send_to_clipboard(win32clipboard.CF_DIB, data)
1
BMP文件的头部偏移量是14个字节。BMP也被称为设备无关位图(DIB)文件格式,所以你不用担心这个14的神秘数字。
顺便提一下,它确实需要一个Windows剪贴板的API。因此你可以使用BMP格式,但不能使用
image.convert("RGB").save(output, "PNG")
data = output.getvalue()[8:]
即使你知道PNG的偏移量是8。
9
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,尤其是当我们刚开始学习编程的时候。比如,有人可能会在使用某个功能时遇到错误,或者发现某些操作没有按照预期的方式工作。
在这种情况下,最好的办法就是去查找相关的信息,看看其他人是怎么解决类似问题的。StackOverflow就是一个很好的地方,很多程序员会在这里分享他们的经验和解决方案。
如果你在使用某个特定的代码块时遇到问题,比如
from cStringIO import StringIO
import win32clipboard
from PIL import Image
def send_to_clipboard(clip_type, data):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(clip_type, data)
win32clipboard.CloseClipboard()
filepath = 'image.jpg'
image = Image.open(filepath)
output = StringIO()
image.convert("RGB").save(output, "BMP")
data = output.getvalue()[14:]
output.close()
send_to_clipboard(win32clipboard.CF_DIB, data)
,你可以把这个代码块放到搜索引擎里,看看有没有人讨论过这个问题,或者有没有解决方案。这样可以帮助你更快地找到答案,避免在同一个问题上浪费太多时间。