【问题标题】:what is the best way to save PIL image in json在 json 中保存 PIL 图像的最佳方法是什么
【发布时间】:2019-08-10 00:11:45
【问题描述】:

我正在尝试发送应该包含枕头图像作为他的字段之一的 json dict,为此我必须将图像转换为字符串。 我尝试使用枕头功能: image.toString() 但仍将其作为字节获取,因此我尝试对其进行编码:

buff = BytesIO()
image.save(buff, format="JPEG")
img_str = base64.b64encode(buff.getvalue())

但仍然以字节为单位。 如何将 Pillow 图像转换为可以保存在 json 文件中的格式?

【问题讨论】:

  • 我不确定我是否理解这个问题。您现在将数据保存为字符串,并且希望将数据保存在 json 文件中,而 json 文件能够保存字符串。所以有什么问题?将您的字符串保存到文件中。
  • 也许这个jstr = json.dumps({"image": base64.b64encode(buff.getvalue()).decode('ascii')})

标签: python json python-imaging-library


【解决方案1】:

在 cmets 中,Mark Setchell 建议根据您的 b64encode 调用结果调用 .decode('ascii')。我同意这会起作用,但我认为 base64encoding 一开始会引入一个不必要的额外步骤,这会使您的代码复杂化。*

相反,我建议直接解码image.tostring 返回的字节。唯一的复杂之处是字节对象可以包含大于 128 的值,因此您无法使用 ascii 对其进行解码。尝试使用可以处理最多 256 个值的编码,例如 latin1

from PIL import Image
import json

#create sample file. You don't have to do this in your real code.
img = Image.new("RGB", (10,10), "red")

#decode.
s = img.tobytes().decode("latin1")

#serialize.
with open("outputfile.json", "w") as file:
    json.dump(s, file)

(*但是,令我惊讶的是,生成的 json 文件仍然比使用 latin1 编码的文件小,至少对于我的示例文件而言。使用您自己的判断来确定文件大小或程序清晰度是否更重要。)

【讨论】:

  • 我不想和你争论或不同意,因为我在这里和下一个人一样学习。我认为 JPEG 编码在减小尺寸方面可能比任何对 base64 效率的担忧更为关键。 3000x4000px 的彩色图像是 36MB,但可能只有 300kB JPEG 编码,其中额外 30% 的 base64 低效率通过省略 JPEG 步骤使 400kB 相形见绌。正如我所说,我是来学习的,但可能是错的——我对 Python 和 JSON 还很陌生,很高兴看到解决方案的另一面并学习。
  • @MarkSetchell 很好的观察。我同意保存为 JPEG 可以显着改善内存。我的示例代码使用tobytes() 而不是image.save(buff, format="JPEG"),因为它稍微简洁一些。但这对我的回答并不重要; OP 应该可以继续使用他们的 BytesIO 策略,无论他们使用 b64-and-ascii 编码还是 latin1 编码。
  • 酷 - 感谢您花时间澄清。你已经有我的投票了。
【解决方案2】:

我使用以下通过json交换枕头图像。

import json
from PIL import Image
import numpy as np

filename = "filename.jpeg"
image = Image.open(filename)
json_data = json.dumps(np.array(image).tolist())
new_image = Image.fromarray(np.array(json.loads(json_data), dtype='uint8'))

【讨论】:

  • 嗨!你能解释一下为什么这是一个很好的问题答案吗?
猜你喜欢
  • 2022-12-07
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2015-07-13
  • 2021-06-28
  • 1970-01-01
  • 2021-11-02
相关资源
最近更新 更多