Как читать jpg или png из буфера обмена windows в python и наоборот?

у меня есть изображение (jpg, png и т. д.) в буфере обмена windows. Я бы хотел сохранить его в файл. win32clipboard, похоже, будет ответом, но каждый пример, который я могу найти, имеет дело с текстом.

скопировать изображение в буфер обмена, затем

import win32clipboard
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData()
with open(name, 'wb') as f:
    f.write(data)
win32clipboard.CloseClipboard()

выдает

TypeError: Specified clipboard format is not available

Я также хотел бы сделать обратное-учитывая файл изображения, напишите его в буфер обмена.

4 ответов


Я бы просто использовать подушка:

from PIL import ImageGrab
im = ImageGrab.grabclipboard()
im.save('somefile.png','PNG')

вам нужно передать параметр в GetClipboardData указание формата данных, которые вы ищете. Вы можете использовать EnumClipboardFormats чтобы увидеть доступные форматы - когда я копирую что-то в Проводнике, мне доступны 15 форматов.

Edit 2: вот код для получения имени файла после копирования файла в Проводнике. Ответ будет совершенно другим, если вы скопировали изображение из программы, браузера для образец.

import win32clipboard
win32clipboard.OpenClipboard()
filename_format = win32clipboard.RegisterClipboardFormat('FileName')
if win32clipboard.IsClipboardFormatAvailable(filename_format):
    input_filename = win32clipboard.GetClipboardData(filename_format)
win32clipboard.CloseClipboard()

Edit 3: из комментариев ясно, что у вас есть фактическое изображение в буфере обмена, а не имя файла изображения. Вы заявили, что не можете использовать PIL, поэтому:

import win32clipboard
win32clipboard.OpenClipboard()
if win32clipboard.IsClipboardFormatAvailable(win32clipboard.CF_DIB):
    data = win32clipboard.GetClipboardData(win32clipboard.CF_DIB)
win32clipboard.CloseClipboard()

на данный момент у вас есть строка (в Python 2) или байты (в Python 3), которая содержит данные изображения. Единственный формат, который вы сможете сохранить .BMP, и вам придется декодировать BITMAPINFOHEADER чтобы получить параметры для a BITMAPFILEHEADER это нужно записать в начало файла.


функции win32clipboard.GetClipboardData() имеет параметр. Параметр по умолчанию указывает, что содержимое буфера обмена должно быть текстовым. Вам нужно передать значение, указывающее формат данных, который вы хотите получить из буфера обмена.

стандартные форматы данных буфера обмена документированы здесь.

также:

посмотреть здесь документация на EnumClipboardFormats() -- в принципе, вам нужен такой код (непроверено) чтобы получить форматы, доступные в настоящее время в буфере обмена:

formats = []
lastFormat = 0
while 1:
    nextFormat = win32clipboard.EnumClipboardFormats(lastFormat)
    if 0 == nextFormat:
         # all done -- get out of the loop
         break
    else:
         formats.append(nextFormat)
         lastFormat = nextFormat
# when you get here, formats contains a list of format codes that
# you can retrieve from the clipboard right now.

С помощью PythonMagick (файлы):

from PythonMagick import Image
Image("clipboard:").write("PNG32:clipboard.png")  # clipboard -> file
Image("clipboard.png").write("clipboard:")  # file -> clipboard