如何从 Python 中的字节获取图像?
How to get image from bytes in Python?
我有一张图片 (jpeg)。
我仅使用 open('img.jpg', 'rb') 从中获取字节。
例如,我将这些字节发送给我的朋友。
那么使用 Python 的哪种方式他可以得到相反的操作 - 来自图像的字节?如何解码?
- 如果他知道格式 - 例如 JPEG。
- 不知道格式的方法。
有什么办法吗?
使用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
我有一张图片 (jpeg)。 我仅使用 open('img.jpg', 'rb') 从中获取字节。 例如,我将这些字节发送给我的朋友。 那么使用 Python 的哪种方式他可以得到相反的操作 - 来自图像的字节?如何解码?
- 如果他知道格式 - 例如 JPEG。
- 不知道格式的方法。 有什么办法吗?
使用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