繁体   English   中英

使用PIL和win32clipboard将图像写入python中的Windows剪贴板?

[英]Write image to Windows clipboard in python with PIL and win32clipboard?

我正在尝试打开图像文件并将图像复制到 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 等,但不想为一次性程序安装另一个库

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)

文件 header BMP 偏移量为 14 字节。 嗯,BMP 也被称为设备无关的 bitmap (DIB) 文件格式,所以你不必担心幻数 14。

仅供参考,它确实需要 windows 剪贴板 API。 因此您可以使用 BMP 但不能使用

image.convert("RGB").save(output, "PNG")
data = output.getvalue()[8:]

即使您知道 PNG 的偏移量是 8。

这在 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)

其他答案的附录,也可以将 PNG(可能还有其他格式)复制到剪贴板。 我使用了以下内容:

buffer = io.BytesIO()
img_out.save(fp=buffer, format='PNG')

clipboard_format = win32clipboard.RegisterClipboardFormat('PNG')
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(clipboard_format, buffer.getvalue())
win32clipboard.CloseClipboard()

buffer.close()

这个对相关问题的回答详细说明了一些程序对我在回答中使用的非标准剪贴板格式“PNG”的支持。 如果您要复制到的程序接受自定义剪贴板格式,这是一个替代方案。 您当然也可以一起定义许多标准和/或非标准剪贴板格式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM