Как мне прочитать JPG или PNG из буфера обмена Windows в Python и наоборот? - PullRequest
12 голосов
/ 12 августа 2011

У меня есть изображение (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 ]

22 голосов
/ 13 августа 2011

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

from PIL import ImageGrab
im = ImageGrab.grabclipboard()
im.save('somefile.png','PNG')
5 голосов
/ 12 августа 2011

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

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

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

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

4 голосов
/ 12 августа 2011

Функция 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.
2 голосов
/ 13 августа 2011

Использование PythonMagick ( двоичные файлы ):

from PythonMagick import Image
Image("clipboard:").write("PNG32:clipboard.png")  # clipboard -> file
Image("clipboard.png").write("clipboard:")  # file -> clipboard
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...