gpt4 book ai didi

python - 在python中将图像转换为字节文字

转载 作者:行者123 更新时间:2023-11-28 21:51:46 28 4
gpt4 key购买 nike

我正在尝试将图像存储为文本,这样我就可以做一些类似 Tk gui 透明图标示例的事情:

import tempfile

# byte literal code for a transparent icon, I think
ICON = (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64

# makes a temp file for the transparent icon and saves it
_, ICON_PATH = tempfile.mkstemp()
with open(ICON_PATH, 'wb') as icon_file:
icon_file.write(ICON)

我已经尝试过 base 64 编码,使用 utf8 解码,转换为字节和字节数组,以及另一篇文章的一些答案:( Python Script to convert Image into Byte array )

import tempfile, base64, io

# byte literal code for a transparent icon, I think
ICON = (b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00'
b'\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00 \x00\x00\x00\x01\x00'
b'\x08\x00\x00\x00\x00\x00@\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
b'\x00\x01\x00\x00\x00\x01') + b'\x00'*1282 + b'\xff'*64

# makes a temp file for the transparent icon and saves it
_, ICON_PATH = tempfile.mkstemp()
with open(ICON_PATH, 'wb') as icon_file:
icon_file.write(ICON)

a = open(ICON_PATH, 'rb').read()

b = base64.b64encode(a)

print b # output does not match what ICON equals above

# doesn't work; gives error
# UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 1342: invalid start byte
# b = bytes(a).decode('utf-8')

c = bytearray(a)

print c # prints garbled junk


# gives error AttributeError: __exit__ on Image.open(ICON_PATH) line
with io.BytesIO() as output:
from PIL import Image
with Image.open(ICON_PATH) as img:
img.convert('RGB').save(output, 'BMP')
data = output.getvalue()[14:]

print data

它也不适用于 b.decode('utf-8') 或 b.encode('utf-8')

最佳答案

我想你在找

print(repr(a))

对于代码中定义的 a,这将打印 b'\x00\x00\x01\x00\x01\x00\x10\x10\x00\x00\x01\x00\x08\x00h\x05\x00\x00\x16\x00\x00\x00(\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x01\x00\x08 和依此类推,类似于您原来的 ICON 定义,但相当大,因为最后的所有 \x00\xff 都被写出来了.


在您的代码中,您包含了一些临时压缩(即 + b'\x00'*1282 + b'\xff'*64)。要自动进行压缩,使源文件中的 ICON 定义不必如此之大,请利用现有的压缩库,例如 zlib:

import zlib
print(repr(zlib.compress(a)))

在我的机器上,打印出 'x\x9cc``\x04B\x01\x01\x06\xc9\xc1\x90\xc1\xca\xc0\xc6\xc0\xc0\xa0\x01\xc4 @!\x06\x05\x06\x888\x088\xb02\x00#\x14\x8f\x82Q0\nF\xc1\x08\x05\xff)\x04\x00U\xf1A\x17',这是相当小。要解压缩,请使用 zlib.decompress:

import zlib

ICON = zlib.decompress(b'x\x9cc``\x04B\x01\x01\x06 \xc9\xc1\x90\xc1\xca\xc0 '
b'\xc6\xc0\xc0\xa0\x01\xc4@!\x06\x05\x06\x888\x088\xb02 \x00#\x14\x8f\x82'
b'Q0\nF\xc1\x08\x05\xff)\x04\x00U\xf1A\x17')

ICON 现在具有与原始示例相同的值。


如果您现在想要在源文件中使用更紧凑的表示,是时候应用 base 64 编码了,它摆脱了 python 中冗长的二进制编码(\x.. -格式)。

编码:

import base64, zlib

print(repr(base64.b64encode(zlib.compress(a))))

这给了我'eJxjYGAEQgEBBiDJwZDBysAgxsDAoAHEQCEGBQaIOAg4sDIgACMUj4JRMApGwQgF/ykEAFXxQRc='

解码:

import base64, zlib

ICON = zlib.decompress(base64.b64decode('eJxjYGAEQgEBBiDJwZDBy'
'sAgxsDAoAHEQCEGBQaIOAg4sDIgACMUj4JRMApGwQgF/ykEAFXxQRc='))

同样,ICON 与最初指定的值相同。


呈现的最终策略适用于 ico 文件。我看到您还提到了 png 文件。这些已经应用了压缩,因此您应该更喜欢仅使用 base 64 编码:

import base64

print(base64.b64encode(png_icon))

PNG_ICON = base64.b64decode( ** insert literal here ** )

事实证明,这些编码也可以通过 str.encode 获得。和 str.decode蜜蜂。这使您无需编写 import 即可。为了完整起见,它们在这里:

编码:

print(repr(a.encode('zlib').encode('base64')))

解码:

ICON = ('eJxjYGAEQgEBBiDJwZDBysAgxsDAoAHEQCEGBQaIOAg4sDIgACMUj4J'
'RMApGwQgF/ykEAFXxQRc=').decode('base64').decode('zlib')

关于python - 在python中将图像转换为字节文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29507890/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com