现在我想在base64中对部分图像进行编码,我确实这样做了。例如,这是图像1080x1920,但需要此图像的一部分。
上:160,左:340,右:1024,下:650。
# first crop
im = Image.open(original)
region = im.crop((160, 340, 1024, 650))
clip_image = os.path.join(screenshot_dir, 'clip.png')
region.save(clip_image)
// then read
f = open(clip_image, 'rb')
ls_f = base64.b64encode(f.read())
f.close()
s = bytes.decode(ls_f)
在我看来,也许我不需要保存已调整大小的图像,我可以直接读取此图像的一部分。如果是这样,程序可以运行得更快,因为没有额外的IO
操作。
答案 0 :(得分:1)
您可以使用tobytes
作为原始图片
此方法从内部存储器返回原始图像数据。对于 压缩图像数据(例如PNG,JPEG)使用带有BytesIO的save() 内存数据的参数。
im = Image.open(original)
region = im.crop((160, 340, 1024, 650))
ls_f = base64.b64encode(region.tobytes())
s = bytes.decode(ls_f)
如果它是png或者jpg,你需要使用BytesIO,或许是这样的:
im = Image.open(original)
region = im.crop((160, 340, 1024, 650))
with io.BytesIO() as temp_file:
region.save(temp_file)
ls_f = base64.b64encode(temp_file.getvalue())
s = bytes.decode(ls_f)
取决于输入图像的格式。如果没有压缩,就像位图bmp一样,它是原始的。压缩格式的示例是png,jpeg,gif。最简单的方法是查看扩展程序,或者尝试一下。如果你在压缩图像上尝试第一种方法,它可能会引发一个异常,或者返回一个扭曲的图像