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

发布于 2024-11-29 13:05:22 字数 636 浏览 1 评论 0原文

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

I'm trying to open an image file and copy the image to the Windows clipboard. Is there a way to fix this:

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)

I could install PythonMagick, etc., but would prefer not installing yet another library for a one-off program

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

画骨成沙 2024-12-06 13:05:22
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)
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)
瑾夏年华 2024-12-06 13:05:22

BMP 的文件头偏移量为 14 个字节。嗯,BMP 也称为设备无关位图 (DIB) 文件格式,因此您无需担心幻数 14。

仅供参考,它确实需要 Windows 剪贴板 API。 无法使用。

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

因此,您可以使用 BMP,但即使您知道 PNG 的偏移量为 8,也

The file header off-set of BMP is 14 bytes. Well, BMP is also known as the device independent bitmap (DIB) file format, so you don't need to worried about the magic number 14.

FYI, it does need a windows clipboard API. Hence you can use BMP but can't use

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

even you know the offset is 8 for PNG.

拧巴小姐 2024-12-06 13:05:22

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

This worked for me in Python 3.8 (solution found here)

It's the same answer as the cgohike's but:

output = StringIO()

changed into:

output = io.BytesIO()

Full code:

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)
忘你却要生生世世 2024-12-06 13:05:22

其他答案的附录,也可以将 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”,我在回答中使用了它。如果您要复制到的程序接受自定义剪贴板格式,这是一种替代方法。当然,您也可以一起定义许多标准和/或非标准剪贴板格式。

Addendum to the other answers, it's also possible to copy PNG (and probably other formats) to the clipboard. I've used the following:

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()

This answer to a related question details support by some programs for the non-standard clipboard format "PNG", which I used in my answer. If the program you want to copy to accepts a custom clipboard format, this is an alternative. You can also of course define many standard and/or non-standard clipboard formats together.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文