2012-06-13 91 views
5

¿Hay alguna manera de utilizar el módulo win32clipboard para almacenar una referencia a un archivo en el portapapeles de Windows en python. Mi objetivo es pegar una imagen de una manera que permita la transparencia. Si arrastro y coloco un archivo 'png' en OneNote o copio el archivo y luego lo pego en OneNote, esto parece preservar la transparencia. Por lo que puedo decir, el portapapeles no puede almacenar imágenes transparentes, por lo que tiene que ser una referencia a un archivo.Almacenar un archivo en el portapapeles en python

Mi investigación sugiere que podría involucrar el atributo win32clipboard.CF_HDrop pero no estoy seguro.

Así que, para resumir, mi objetivo es tener un poco de código python en el que pueda hacer clic y que utilice un archivo específico en mi Escritorio llamado 'img.png', por ejemplo. El resultado es que 'img.png' se almacena en el portapapeles y se puede pegar en otros programas. Esencialmente, el mismo comportamiento como si yo mismo hubiera seleccionado el archivo en el escritorio, hice clic derecho y seleccioné 'Copiar'.

EDIT: Esta página parece sugerir que hay una manera usando win32clipboard.CF_HDrop alguna manera: http://timgolden.me.uk/pywin32-docs/win32clipboard__GetClipboardData_meth.html

Dice "CF_HDROP" se asocia con "una tupla de nombres de archivo Unicode"

+0

popen y clip.exe, en la parte superior de mi cabeza –

+0

Resulta que puede almacenar una imagen en el portapapeles, pero no con transparencia. Aceptaré la respuesta de Khalid, pero no es 100% lo que quería. –

Respuesta

0
from PythonMagick import Image 
Image("img.png").write("clipboard:") 

Tome el windows binaries para PythonMagick

+0

Parece que no funciona. Cuando pego la imagen, ya no tiene un fondo transparente. –

+0

Entonces, ¿está diciendo que la operación de copiar y pegar realmente funciona, pero su imagen está de alguna manera corrupta? –

+0

No creo que "corrompido" sea la palabra correcta. Como mencioné en mi pregunta, lo que me preocupa es pegar una imagen que tiene un fondo transparente. Creo que el problema es que el portapapeles puede almacenar información de imágenes directamente o algún tipo de referencia a un archivo. Si se almacenan los datos de la imagen, se pierde la transparencia. Si se almacena la referencia al archivo, Windows parece saber cómo mantener la transparencia al insertar un 'png' en un archivo. –

1

Escribo esto como una respuesta, aunque es solo un paso que podría ayudarlo, porque los comentarios no tienen mucho formato, opt iones.

Escribí este script de ejemplo:

import win32clipboard as clp, win32api 

clp.OpenClipboard(None) 

rc= clp.EnumClipboardFormats(0) 
while rc: 
    try: format_name= clp.GetClipboardFormatName(rc) 
    except win32api.error: format_name= "?" 
    print "format", rc, format_name 
    rc= clp.EnumClipboardFormats(rc) 

clp.CloseClipboard() 

Entonces selecciona un archivo de imagen en el explorador y copiaron; a continuación, la secuencia de comandos informa de los siguientes formatos de portapapeles disponibles:

format 49161 DataObject 
format 49268 Shell IDList Array 
format 15 ? 
format 49519 DataObjectAttributes 
format 49292 Preferred DropEffect 
format 49329 Shell Object Offsets 
format 49158 FileName 
format 49159 FileNameW 
format 49171 Ole Private Data 

Este “DropEffect preferido” parece sospechoso, aunque estoy lejos de ser un experto de Windows. Sin embargo, probaría primero con FileNameW, ya que esto podría hacer el trabajo por usted (no tengo instalado OneNote, lo siento). Parece que espera como datos solo la ruta de acceso completa codificada como 'utf-16-le' con un carácter nulo (es decir, codificado como '\0\0') al final.

Cuestiones relacionadas