Как добавить/получить данные изображения в буфер обмена ОС с помощью Python?

У меня есть код Python, который редактирует файлы изображений и хотел бы знать, как для добавления данных изображения в буфер обмена операционной системы и получения оттуда.

При поиске кросс-платформенного решения для замены или получения текста буфера обмена в Python,
было много простых ответов для этого (например, используя встроенный модуль Tkinter с some code).
Однако эти методы могут использовать только обычный текст, а не другие данные буфера обмена, такие как изображения.

Моя версия Python - 3.x для Windows, но ответ должен быть кросс-платформенным
(работа в разных операционных системах), а также поддержка других версий Python, таких как 2.x.
Я думаю, что он должен использовать только встроенные модули Python, и код не должен быть слишком сложным (или иметь объяснение того, что он делает). Это может быть модуль Python, потому что файлы могут быть включены в ту же папку, что и переносимый программный код, чтобы избежать установки.

Есть и другие связанные с этим вопросы, которые, вероятно, работают для изображений, но они поддерживают только отдельную операционную систему. Лучшие были Скопировать изображение в буфер обмена в Python3 и Написать образ в буфер обмена Windows в python с PIL и win32clipboard?.
Описанные здесь методы (только для Windows) используют следующие шаги:

  • Получить сырые двоичные данные изображения - метод загружает файл изображения с помощью Python Imaging
    Library (PIL/Pillow), потому что у этого есть другие функции обработки, используемые позже, в простой форме и популярный стандартный API. Это можно сделать с помощью другого модуля (например, Pygame).
  • Создайте переменную объекта файла (для потоковой передачи ввода/вывода в памяти), используя встроенный io
    модуль. Для Python 2.x используется from cStringIO import StringIO, но с Python 3,
    лучший io.BytesIO тип объекта двоичного потока - более старые теперь разрешают только текст.
  • Сохранение данных изображения в формате BMP (формат растрового изображения/растрового изображения Windows),
    к переменной объекта файла с предыдущего шага. Метод, использующий PIL/Pillow, сначала преобразует эти данные с .convert("RGB") для переменной, содержащей ее.
  • Получить полное содержимое буфера памяти переменных объекта объекта в виде двоичных данных (объект bytes),
    отрежьте его из положения 14, чтобы удалить 14-байтовый заголовок формата BMP/DIB, затем сохраните его
    как переменную. Метод говорит, что нарезка этих данных работает на 32 или 64-битных системах, но
    нужен API буфера обмена Windows, поэтому он не работает для другого формата файла.
  • Закройте буфер памяти и скопируйте данные изображения с предыдущего шага в буфер обмена.
    Этот метод используется в Windows с помощью части win32clipboard модуля расширения -
    он открывает буфер для использования, очищает его, устанавливает его значение в переменную данных изображения из файла предыдущий шаг (с использованием типа BMP/DIB) закрывает открытый буфер обмена.

Кроме того, есть простой текстовый модуль с межплатформенным буфером обмена, называемый Pyperclip, который является только один файл для версии 1.5.6 и, возможно, имеет код, который может обрабатывать данные изображения.

Ответ 1

Здесь функция Python, основанная на этот ответ, который заменяет/возвращает текст буфера обмена с помощью Tkinter.

def use_clipboard(paste_text=None):
    import tkinter # For Python 2, replace with "import Tkinter as tkinter".
    tk = tkinter.Tk()
    tk.withdraw()
    if type(paste_text) == str: # Set clipboard text.
        tk.clipboard_clear()
        tk.clipboard_append(paste_text)
    try:
        clipboard_text = tk.clipboard_get()
    except tkinter.TclError:
        clipboard_text = ''
    r.update() # Stops a few errors (clipboard text unchanged, command line program unresponsive, window not destroyed).
    tk.destroy()
    return clipboard_text

Этот метод создает быстро скрытое окно, которое быстро закрывается, поэтому это не должно быть проблемой. Кроме того, он поддерживает только простой текст в буфер обмена, а не изображения, которые я задал в вопросе выше.

Ответ 2

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

API-интерфейсы буфера обмена отличаются от разных операционных систем.

Я предлагаю вам использовать модуль буфера обмена.

https://pypi.python.org/pypi/clipboard/0.0.4

Ответ 3

Как заявил Мартин ---

Pyperclip определенно является хорошим вариантом и работает как шарм.

Я не знаю, почему вы не должны его использовать.

Его так же просто, как 3 строки ниже,

import pyperclip
pyperclip.copy('The text to be copied to the clipboard.')
paste= pyperclip.paste()

Ответ 4

Библиотека xerox проста и работоспособна.