在Python3中将图像复制到剪贴板

xpt*_*xpt 6 python windows clipboard python-3.x

首先,在python中将 SO 复制图像复制到剪贴板的问题导致回答使用PIL和win32clipboard在python中将图像写入Windows剪贴板?,这对Python 2.x只有好处. - 我试了一下它没用.我克服了一个问题:StringIO和cStringIO模块在Python 3.0中消失了:但是碰到了另一个:

TypeError: string argument expected, got 'bytes'
Run Code Online (Sandbox Code Playgroud)

因此,再次为Python 3重新提出同样的问题 - 如何在Python 3中将图像复制到剪贴板?这是我到目前为止的代码:

from io 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)
Run Code Online (Sandbox Code Playgroud)

谢谢

Sha*_*ger 6

你不想StringIO在这里.图像是原始二进制数据,并且在PY3,str纯粹是为了文本,bytesbytes样对象(bytearray的,连续的memoryviewS,mmapS)是用于二进制数据.要替换StringIO.StringIO二进制数据的Py2 ,你想io.BytesIO在Python 3中使用,而不是io.StringIO.

  • 在带有枕头和PyWin32 219的Windows 7上进行了测试,它与BytesIO配合使用 (3认同)

小智 6

我确实复制了代码并将 StringIO 替换为 BytesIO 并且它起作用了!(带有 *.jpg 和 *.png 文件)非常感谢!

from io import BytesIO
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 = 'Ico2.png'
image = Image.open(filepath)

output = BytesIO()
image.convert("RGB").save(output, "BMP")
data = output.getvalue()[14:]
output.close()

send_to_clipboard(win32clipboard.CF_DIB, data)
Run Code Online (Sandbox Code Playgroud)


can*_*bax 5

对于那些想要复制粘贴的人

# parameter must be a PIL image 
def send_to_clipboard(image):
    output = BytesIO()
    image.convert('RGB').save(output, 'BMP')
    data = output.getvalue()[14:]
    output.close()

    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(win32clipboard.CF_DIB, data)
    win32clipboard.CloseClipboard()
Run Code Online (Sandbox Code Playgroud)