Как скопировать картинку PIL в буфер обмена - PullRequest
1 голос
/ 16 июня 2019

Я работаю с холстом в Tkinter и пытаюсь скопировать содержимое этого холста в буфер обмена.

Я могу решить эту проблему, создав файл, а затем скопироватьсодержимое этого файла в буфер обмена с помощью xclip -selection clipboard -t image/png -i temp_file.png, но я хочу использовать вместо этого буфер, позволяющий пользователю копировать его непосредственно в буфер обмена, не касаясь файловой системы пользователя.

Для использования xclipВходная функция, я требую дать имя файла, а не строку.Я могу обойти это с помощью echo / cat как cat temp_file.png < echo | xclip -selection clipboard -t image/png -i или cat file_name.png | xclip -selection clipboard -t image/png -i в bash-line.

Я успешно смог использовать буфер для хранения холста, например:

memory = io.BytesIO()
img.save(memory, format="png")
return memory

и может сохранить изображение в файл следующим образом:

img = pil.Image.open(memory)
img.save("file_name.png", format="png")

Насколько я понял, из документации пил, pil.Image.open - это то же самое, что встроенная функция open().,Тем не менее, пытаясь использовать open () для чтения файла, он утверждает, что BytesIO не является допустимым файлом.Думаю, это не большая проблема.

Я могу прочитать содержимое буфера с помощью memory.getvalue(), а затем удалить окружающие b'...' с помощью [2: -1].Затем я заменяю все ' в строке на \', так что я могу заключить ее в одинарные кавычки, и в итоге получаю эхом указанную строку с командой, которую я использовал в файле ранее.* Вывод cat file_name.png в значительной степени совпадает с выводом строки, которую я даю echo в моем подпроцессе, но, похоже, следующее не делает эту работу за меня, так как мой буфер обмена остается нетронутым:

bash_cmd = f"echo -n {img_data} | xclip -selection clipboard -t image/png -i"
p = sp.Popen(bash_cmd, shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)

но

bash_cmd = f"xclip -selection clipboard -t image/png -i file_name.png"
p = sp.Popen(bash_cmd, shell=True, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)

работает.

tl; dr

Что я делаю не так?Я изменяю содержимое файла и создаю поврежденное изображение, которое затем копируется?

Как правильно вывести содержимое io.BufferIO в буфер обмена (в основном в Unix / Linux, но такжев MacOS / Windows)?

...