如果只是处理 JPG/PNG
格式用以下代码就可以完成任务,配合注册表可以在不打开图片的情况下右键复制图片内容。但在处理 gif
时 image.save(output, "GiF")
则无输出结果。
# coding:utf-8
import sys
import traceback
import win32clipboard
from io import BytesIO
from PIL import Image
def send_to_clipboard(clip_type, data):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardData(clip_type, data)
win32clipboard.CloseClipboard()
def get_image_data(args):
image = Image.open(args)
output = BytesIO()
image.convert("RGB").save(output, "BMP")
data = output.getvalue()[14:] # Bitmap header size
return data
if __name__ == "__main__:
try:
data = get_image_data(sys.argv[1])
send_to_clipboard(win32clipboard.CF_DIB, data)
except Exception:
traceback.print_exc()
手动复制一张 gif 图,查看两种图片编码会得到如下结果:
import chardet
def test():
try:
with open("1.gif", "rb") as f:
data = f.read()
print(f"get stream from BytesIO", data[:30])
print(chardet.detect(data[:30]))
except Exception as e:
print(str(e))
try:
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData(win32clipboard.CF_DIB)
print(f"get stream from windows clipboard", data[:30])
print(chardet.detect(data[:30]))
except Exception as e:
print(str(e))
finally:
win32clipboard.CloseClipboard()
get stream from BytesIO b'GIF89aJ\x03T\x02\xf7\xff\x00\\d_+bV\x18\x18\x1c\xd9\xd2\x9du\xa1\'
{'encoding': 'Windows-1252', 'confidence': 0.73, 'language': ''}
get stream from windows clipboard b'(\x00\x00\x00J\x03\x00\x00T\x02\x00\x00\x01\x00 \x00\x03\x00'
{'encoding': 'ISO-8859-1', 'confidence': 0.73, 'language': ''}
直接对 BytesIO
输出的数据流进行转码 data[14:].decode("Windows-1252").encode("ISO-8859-1")
也解决不了问题。求解
References: