首页 > 解决方案 > 从 python 的枕头模块生成的字节显示 img

问题描述

我使用枕头模块用 python 读取 jpg 图像:

from PIL import Image

img = Image.open('./test.jpg')
bytes = img.tobytes()

如果我打印bytes我会得到这样的东西:

print(f'{bytes}')
# b'\xbe\xb0i\xb1\xa4^\xb1\xaad\xab\xa7`\xc2\xc0v\x96\x91Oj_2\xb7...

然后我将此“字节字符串”发送给我js以显示它:

var b64imgData = btoa(bytes); // bytes is the 'bytes string' show upper
var img = new Image();
img.src = "data:image/jpg;base64," + b64imgData;

$('#imgCtn').append(img);

遗憾的是,最终的图像源似乎无效,因为我得到了无效的图像图标而不是我的图像test.jpg

有人知道问题出在哪里吗?


编辑1:

正如@cubrr提到的,不要img.tobytes()对 jpg 文件使用方法。所以对于python代码,请使用这个:

from PIL import Image

img = Image.open('./test.jpg')
imageBytes = io.BytesIO()
img.save(imageBytes, format='JPEG')
bytes = imageBytes.getvalue()

标签: javascriptpythonpython-imaging-library

解决方案


枕头的文档中

Image.tobytes(encoder_name='raw', *args)

...

警告:此方法从内部存储返回原始图像数据。对于压缩图像数据(例如 PNG、JPEG),请使用 save(),并为内存中的数据使用 BytesIO 参数。

所以尝试使用save来获取 JPG 字节而不是原始内部图像数据:

img = Image.open('./test.jpg')
imageBytes = io.BytesIO()
img.save(imageBytes, format='JPEG')
bytes = imageBytes.getvalue()

如果仍然不起作用,请详细说明“将此字节字符串发送到我的 js”的含义。您如何发送和接收它(请提供代码)?


推荐阅读