首页 > 解决方案 > 在 Python 中将 JSON 字符串转换为图像

问题描述

我从 SQL Server 接收到一个 JSON 文件,其中包含我需要保存到磁盘的图像的字符串表示形式。

JSON 流使用带有“FOR JSON AUTO”的 Base64 编码 - 下面是生成 JSON 的 SP,其中图像已存储在数据库中:

SELECT @JSON_OUT =
(SELECT W.W_WEB_STYLE_NAME,I.PIC_TYPE,I.IMAGE   
FROM STYLE_WEB W
   INNER JOIN dbo.IMAGES I ON I.STYLEID = W.StyleID
     FOR JSON AUTO)

我可以使用带有 base64 的字符串进行解码,但是 PIL 无法将生成的字节作为图像读取。

读取字节数据似乎有一个带有“System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”和“System.Drawing.Bitmap”的标题,但文件不作为位图读取( bmp)正如我所料。

我还比较了一些 bmp 图像文件,但没有在文件中找到这些System.Drawing和/或System.Drawing.Bitmap字符串。

来自 JSON 的编码图像字符串位于以下链接中:

https://drive.google.com/file/d/1iOgk7RE0XLV_AaMwDH4xjPIqpMeRBUcp/view?usp=sharing

我试图用 PIL 读取的解码数据在这里:

https://drive.google.com/file/d/1_rVAFqGNrYRwEx9BRjoImNj-gmbHke0j/view?usp=sharing

我已经成功地编码、解码和使用 PIL 处理所有类型的图像字符串,但这个让我感到困惑。希望有人对此有/答案。

到目前为止我用来测试图像并尝试打开它的代码如下:

image = base64.standard_b64decode(imageDataString)
print(imghdr.what(None,h=image) # returns none
im = Image.open(BytesIO(image)) # returns "cannot identify image file error from PIL

更新: 2020 年 12 月 4 日

不确定这是否是更新此问题的最佳方式(如果不是,请发表评论)?

事实证明 - 数据库开发人员通过用“位图包装器”包装原始图像来“装饰”原始图像,以便图像出现在他的 .Net 应用程序组件中。

我让他存储“未包装”的图像,然后从他的存储过程中将它们返回给我。一旦进行了更改,我就不再有任何问题从 json 解码图像字符串并将图像保存到磁盘。

所以......从位图“包装器”中提取jpeg图像的问题没有解决,但我不需要为我的应用程序解决它。

标签: pythonjsonsql-serverimagepython-imaging-library

解决方案


顺便说一句,看起来该文件实际上是 System.Drawing.Bitmap 对象的 .NET 二进制序列化。

格式的规范


推荐阅读