win32clipboard 复制 gif 的问题

查看 30|回复 0
作者:evemoo   
如果只是处理 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:
  • win32clipboard
  • BMP_file_format
  • What is the header size of png, jpg/jpeg, bmp, gif and other common graphics format?
  • whatsinagif/bits_and_bytes
  • 您需要登录后才可以回帖 登录 | 立即注册

    返回顶部