代码之家  ›  专栏  ›  技术社区  ›  Theo d'Or

如何使用Tkinter将剪贴板中的图像数据保存到Debian上Python3中的文件中?

  •  0
  • Theo d'Or  · 技术社区  · 6 年前

    我想用 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 回复  |  直到 6 年前
        1
  •  0
  •   Theo d'Or    6 年前

    使用转换方法,在 separate SO question ,对于png数据的hexdump 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()
    

    据我所知,这是在Linux(Debian)上将PNG文件从剪贴板读入Python3的最佳方法。