如何从 Python 中的字节获取图像?

How to get image from bytes in Python?

我有一张图片 (jpeg)。 我仅使用 open('img.jpg', 'rb') 从中获取字节。 例如,我将这些字节发送给我的朋友。 那么使用 Python 的哪种方式他可以得到相反的操作 - 来自图像的字节?如何解码?

  1. 如果他知道格式 - 例如 JPEG。
  2. 不知道格式的方法。 有什么办法吗?

使用PIL模块。此处答案中的更多信息:

from PIL import Image
from io import BytesIO


with open('img.jpg', 'rb') as f:
    data = f.read()

    # Load image from BytesIO
    im = Image.open(BytesIO(data))

    # Display image
    im.show()

    # Save the image to 'result.FORMAT', using the image format
    im.save('result.{im_format}'.format(im_format=im.format))

你检查过this question and this one了吗?它们与您的情况非常相似。如果将它们转换为字节,图像的 AFAIK 原始格式也没有任何区别。所以链接questions/answers应该没问题。但是,如果它们不起作用,请更新您的问题。

如果您不想使用外部库,可以使用字节签名(即文件的前几个字节)来确定图像压缩类型。

以下是一些常见的图片格式。

img_types = {
    b'\xFF\xD8\xFF\xDB': 'jpg',
    b'\xFF\xD8\xFF\xE0': 'jpg',
    b'\xFF\xD8\xFF\xEE': 'jpg',
    b'\xFF\xD8\xFF\xE1': 'jpg',
    b'\x47\x49\x46\x38\x37\x61': 'gif',
    b'\x47\x49\x46\x38\x39\x61': 'gif',
    b'\x42\x4D': 'bmp',
    b'\x89\x50\x4E\x47\x0D\x0A\x1A\x0A': 'png'
}

with open('path/to/image', 'rb') as fp:
    img_bytes = fp.read()

for k, v in img_types.items():
    if img_bytes.startswith(k):
        img_type = v
        break
else:
    img_type = None