Python转换图片Base64编码并存入Windows剪贴板

主要使用的库

1
2
from base64 import b64encode    # 编码 Base64
from win32clipboard

剪贴板类型

复制的 文件, 图片, 文本 在剪贴板中分别以以下格式标志:

1
2
3
4
5
图片    CF_DIB          与设备无关的位图格式内存块
文本 CF_TEXT 以 NULL 结尾的 ANSI 字符集字符串
CF_UNICODETEXT 含有 Unicode 编码字节的内存块
CF_OEMTEXT 含有文字数据的内存块
文件 CF_HDROP 用于键入 HDROP 的句柄, 用于标识文件列表. 应用程序可以通过将句柄传递给 DragQueryFile 函数来检索有关文件的信息

base64encode

b64encode() 仅接受字节对象作为参数, 并生成对应的 base64 字节流返回, 如果需要转换为字符串, 需要自行使用 decode() 解码.

1
2
3
4
5
6
7
8
9
10
11
In [1]: from base64 import b64encode

In [2]: sinput = "This is a string, not a bytes-object"

In [3]: soutput = b64encode(sinput.encode("utf-8")) # 要转码一个字符串, 需要先将其编码为字节.

In [4]: soutput
Out[4]: b'VGhpcyBpcyBhIHN0cmluZywgbm90IGEgYnl0ZXMtb2JqZWN0'

In [5]: soutput.decode("utf-8")
Out[5]: 'VGhpcyBpcyBhIHN0cmluZywgbm90IGEgYnl0ZXMtb2JqZWN0'

SetClipboardText

SetClipboardText() 是 Python 库 win32clipboard 中定义的一个函数. win32clipboard 存储在 Python 根目录下的 /Lib/site-packages 中, 而且是 .pyd 文件, 无法查看源代码. (并且其自身文档非常简略, 不过异常报错有中文…)

我在 这里 找到了相关的文档.

要使用此函数, 必须先 “打开” 剪贴板, 并在使用后 “关闭” 它.

例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import win32clipboard

win32clipboard.OpenClipboard()
win32clipboard.GetClipboardData(CF_HDROP)
"这将读取 CF_HDROP 的内容并返回一个元组, 元组的元素是文件路径的字符串"
win32clipboard.CloseClipboard()

win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
"向剪贴板放入内容前必须先清空"
win32clipboard.SetClipboardText("嘿!".encode("utf-8"), win32clipboard.CF_UNICODETEXT)
"只能向剪贴板中放入字节流, 如果含有非 ascii 字符(如, 中文), 则必须将其以 CF_UNICODETEXT 格式存入剪贴板中, 否则乱码"
win32clipboard.SetClipboardText("Hello!".encode("ascii"), win32clipboard.CF_TEXT)
"如果只有 ASCII 字符, 则可使用 CF_TEXT 格式"
win32clipboard.CloseClipboard()

便将文本放入了剪贴板.

成品代码

另外, 发现无论如何复制, 一定会有一个 CF_HDROP 句柄指向图片的缓存路径.

现在就来看看效果如何吧! (查看下方图片的源代码, 会发现一个长得恐怖的字符串…)

示例图片