Search code examples
pythonpython-imaging-librarypywin32

Write image to Windows clipboard in python with PIL and win32clipboard?


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


Solution

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