Как добавить/получить данные изображения в буфер обмена ОС с помощью 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
проста и работоспособна.