如何将多张图像复制到剪贴板?

问题描述 投票:0回答:1

我希望能够将多个图像复制到剪贴板,以便我可以将它们粘贴到其他程序(例如 Discord)中。我发现我可以通过在文件资源管理器中选择多个文件并以这种方式复制它们来做到这一点,效果很好。然而,当我尝试用 python 脚本复制它时,我无法让它工作。

使用“win32clipboard”模块,我可以使用以下代码一次将一张图像复制到剪贴板:

from io import BytesIO
from win32 import win32clipboard
from PIL import Image

def send_to_clipboard(clip_type, filepath):
    
    image = Image.open(filepath)

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

    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(clip_type, data)
    win32clipboard.CloseClipboard()
    print("DONE")

send_to_clipboard(win32clipboard.CF_DIB, '3z6xsu93v1h91.jpg')

此后,我想尝试同时将多个图像复制到剪贴板。我尝试用这段代码来做到这一点:

from io import BytesIO
from win32 import win32clipboard
from PIL import Image
import time

def send_to_clipboard(clip_type, filepath):

    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()

    for file in filepath:

        time.sleep(1)
    
        image = Image.open(file)

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

        win32clipboard.SetClipboardData(clip_type, data)

    win32clipboard.CloseClipboard()
        
    print("DONE")

send_to_clipboard(win32clipboard.CF_DIB, ['3z6xsu93v1h91.jpg', 'Andrew Tate.jpeg'])

但是,这段代码不起作用。复制到剪贴板的唯一图像是图像数组中的最后一个图像,大概是因为每次我将数据发送到剪贴板时,它都会覆盖之前的内容,这让我感到困惑,因为我认为这就是“win32clipboard.EmptyClipboard( )”是为了。

我很茫然,所以我尝试使用人工智能来提出解决方案,但没有任何进展。 ChatGPT 告诉我“win32clipboard”模块本身不支持在剪贴板中存储多个对象,这是真的吗?如果是的话,我可以使用另一个模块或类似的东西吗?谢谢您的宝贵时间。

python windows image clipboard
1个回答
0
投票

是的,win32clipboard 模块本身并不支持一次将多个图像复制到剪贴板。剪贴板通常一次只保存一项,因此当您添加新项时,它会覆盖现有项。

要实现将多个图像复制到剪贴板,您需要将图像组合成一张图像,然后将该组合图像复制到剪贴板。不幸的是,没有直接的方法可以在剪贴板中同时保存多个独立图像以粘贴到其他程序中。

您可以采取以下一种方法:

将图像组合成单个图像(网格或垂直堆叠) 将组合图像复制到剪贴板 这是脚本的修改版本,它在将图像复制到剪贴板之前垂直组合图像:

    from io import BytesIO
from win32 import win32clipboard
from PIL import Image

def combine_images(image_paths):
    images = [Image.open(image_path) for image_path in image_paths]

    # Find the total height and maximum width to create a combined image
    total_height = sum(image.height for image in images)
    max_width = max(image.width for image in images)

    combined_image = Image.new('RGB', (max_width, total_height))

    # Paste each image one below the other in the new combined image
    y_offset = 0
    for image in images:
        combined_image.paste(image, (0, y_offset))
        y_offset += image.height

    return combined_image

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

    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardData(clip_type, data)
    win32clipboard.CloseClipboard()
    print("DONE")

image_paths = ['3z6xsu93v1h91.jpg', 'Andrew Tate.jpeg']  # List of images
combined_image = combine_images(image_paths)
send_to_clipboard(win32clipboard.CF_DIB, combined_image)

说明: 组合图像函数:通过将所有图像粘贴到具有足够高度以容纳所有图像的新图像中,垂直组合所有图像。 send_to_clipboard 函数:它将组合图像转换为 BMP 格式并将其复制到剪贴板,与原来的方法类似。 这样,当您粘贴到另一个程序(例如 Discord)时,您将看到组合图像。

限制:

这种方法会从所有图像中创建一个图像,因此一旦粘贴,它们将不再是独立的图像。

如果您需要每个图像保持独立,不幸的是,Windows 剪贴板本身并不支持这一点,解决方法是处理使用 Python 的基本剪贴板库不容易处理的剪贴板格式和结构。

© www.soinside.com 2019 - 2024. All rights reserved.