win32clipboard 复制 gif 的问题

2023-02-10 17:07:58 +08:00
 evemoo

如果只是处理 JPG/PNG 格式用以下代码就可以完成任务,配合注册表可以在不打开图片的情况下右键复制图片内容。但在处理 gifimage.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:

1413 次点击
所在节点    Python
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/914966

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX