2011-08-13 2 views
4

Я пытаюсь открыть файл изображения и скопировать изображение в буфер обмена Windows. Есть ли способ, чтобы исправить это:Напишите изображение в буфер обмена Windows в python с PIL и win32clipboard?

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

ответ

7
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) 
+0

совершенным. благодаря! – foosion

+0

Почему магическое число 14? Будет ли он разбиваться на Python 3 или 64-битный Python? Большое спасибо за чрезвычайно полезный ответ. –

+0

@MichaelPlatings 14, потому что файл BMP имеет 14-байтовый заголовок. Этот заголовок остается равным 14 байтам, копируется ли BMP-файл в 32-разрядную или 64-разрядную систему. В Python 3 вам нужно изменить 'StringIO' на' BytesIO'. –

1

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

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

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

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