You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现剪贴板复制文本+换行+图片的方法及报错解决

问题

我编写了以下Python代码实现将图片复制到剪贴板:

from io import BytesIO
import win32clipboard
from PIL import Image

image = Image.open('image.jpg')
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()

现在希望将文本hello、换行、图片依次复制到剪贴板,尝试了以下代码:

win32clipboard.SetClipboardData(win32clipboard.CF_DIB,BytesIO(StringIO('hello_world' + '\n').read().encode('utf8')) + data)

但出现报错:TypeError: unsupported operand type(s) for +: '_io.BytesIO' and 'bytes',请问该如何解决?

解决方案

错误根源

  1. 类型不兼容:你试图将BytesIO对象与bytes数据直接相加,这两种类型不支持+运算符;
  2. 格式误用:CF_DIB是仅用于位图数据的剪贴板格式,无法直接存储文本。要同时存放文本和图片,需向剪贴板写入多种格式数据,或使用支持富内容的格式(如HTML)整合两者。

方法1:同时写入纯文本与图片格式

这种方式下,剪贴板会同时保存纯文本和图片数据,不同程序粘贴时会自动选择适配的格式:

from io import BytesIO
import win32clipboard
from PIL import Image

# 处理图片DIB数据
image = Image.open('image.jpg')
output = BytesIO()
image.convert('RGB').save(output, 'BMP')
dib_data = output.getvalue()[14:]
output.close()

# 处理文本数据(CF_UNICODETEXT要求UTF-16LE编码)
text_data = 'hello\n'.encode('utf-16le')

win32clipboard.OpenClipboard()
try:
    win32clipboard.EmptyClipboard()
    # 写入纯文本格式
    win32clipboard.SetClipboardData(win32clipboard.CF_UNICODETEXT, text_data)
    # 写入图片DIB格式
    win32clipboard.SetClipboardData(win32clipboard.CF_DIB, dib_data)
finally:
    win32clipboard.CloseClipboard()

方法2:用HTML格式整合文本与图片(推荐富文本场景)

如果需要粘贴后保持「文本+换行+图片」的排版顺序,适合使用HTML格式,在支持HTML的编辑器(如Word、浏览器、微信编辑器)中粘贴会直接显示组合内容:

from io import BytesIO
import win32clipboard
from PIL import Image
import base64

# 将图片转为Base64编码
image = Image.open('image.jpg')
output = BytesIO()
image.save(output, 'PNG')
img_base64 = base64.b64encode(output.getvalue()).decode('utf-8')
output.close()

# 构造符合剪贴板CF_HTML规范的内容
html_content = f"""Version:0.9
StartHTML:00000001
EndHTML:00000002
StartFragment:00000003
EndFragment:00000004
<html>
<body>
<p>hello<br></p>
<img src="data:image/png;base64,{img_base64}">
</body>
</html>"""

win32clipboard.OpenClipboard()
try:
    win32clipboard.EmptyClipboard()
    # 写入HTML格式数据
    win32clipboard.SetClipboardData(win32clipboard.CF_HTML, html_content.encode('utf-8'))
finally:
    win32clipboard.CloseClipboard()

内容的提问来源于stack exchange,提问作者ZombZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:35:12