Как сохранить данные изображения из буфера обмена в файл в Python 3 на Debian, используя tkinter? - PullRequest
0 голосов
/ 24 января 2019

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

from tkinter import Tk
r = Tk()
r.withdraw()
clip = r.clipboard_get(type="image/png")
r.update()
r.destroy()
with open("testbytes.png", mode="bw+") as f:
    f.write(clip.encode())

Когда я пытаюсь открытьВ файле testbytes.png программа просмотра изображений сообщает о фатальной ошибке, а не в формате PNG.Я получил параметр type для вызова clipboard_get() с помощью r.selection_get(selection='CLIPBOARD', type='TARGETS'), который возвратил:

'TIMESTAMP TARGETS MULTIPLE SAVE_TARGETS image/png image/bmp image/x-bmp image/x-MS-bmp image/x-icon image/x-ico image/x-win-bitmap image/vnd.microsoft.icon application/ico image/ico image/icon text/ico image/tiff image/jpeg '

Я думаю, что формат данных в буфере обмена - PNG.Я также пробовал JPEG, BMP и TIFF, но они приводят к похожим ошибкам.

Что я делаю не так?

1 Ответ

0 голосов
/ 25 января 2019

Используя метод преобразования, полученный в отдельном вопросе SO , для шестнадцатеричной записи данных PNG, которые tkinter предоставляет из буфера обмена, правильный код:

from tkinter import Tk
r = Tk()
r.withdraw()
clip = r.clipboard_get(type="image/png")
r.update()
r.destroy()
# Convert hexdump to bytes
clip = bytes([eval(h) for h in clip.strip().split(' ')])
with open("testbytes.png", mode="bw+") as f:
    f.write(clip)

Помимо записи файла PNG, данные также могут быть загружены с помощью модуля pillow (ранее известного как PIL):

import io
from PIL import Image
cf = io.BytesIO(clip)
cim = Image.open(cf)
cim.show()

Насколько я смог определить, этоявляется лучшим способом чтения PNG-файла из буфера обмена в Python 3 в Linux (Debian).

...