Напишите изображение в буфер обмена Windows в python с PIL и 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 и т.д., но предпочел бы не устанавливать еще одну библиотеку для одноразовой программы

Ответ 1

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)

Ответ 2

Сбой заголовка файла BMP составляет 14 байтов. Ну, BMP также известен как формат независимого растрового файла (DIB), поэтому вам не нужно беспокоиться о магическом номере 14.

FYI, ему нужен API буфера обмена Windows. Следовательно, вы можете использовать BMP, но не можете использовать

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

даже если вы знаете, что смещение равно 8 для PNG.