使用Python将JSON字符串转换为图像。

3
我从SQL Server收到一个JSON文件,其中包含图像的字符串表示,我需要将其保存到磁盘上。
JSON流采用Base64编码,并使用“FOR JSON AUTO”进行编码 - 以下是生成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图像的问题没有得到解决,但我不需要为我的应用程序解决这个问题。


我认为位图只是一个二进制文件,也许你需要去掉那些头部信息。尝试将其写入文件并在文本编辑器中进行操作,直到你可以在图像程序中加载它。 - JeffUK
这绝对不是BMP格式。在其中看到“JFIF”提示它是JPEG格式,但似乎不是有效的JPEG格式。 - JeffUK
你需要移除那些文件头,该文件在'JFIF'之前6个字节开始。http://fileformats.archiveteam.org/wiki/JFIF - JeffUK
JeffUK - 我相信你是正确的 - 我能够在编辑器中操作该文件并使其正确读取。现在我只需要弄清楚如何在解码之前拆分字符串。谢谢! - Carl Rendell
编辑了我的先前评论,并附上了一个应该有所帮助的链接!根据您的来源,它可能是固定长度的标头,或者您可以找到JFIF指纹。 - JeffUK
2个回答

1
顺便说一下,看起来这个文件实际上是一个System.Drawing.Bitmap对象的.NET二进制序列化文件。
格式规范

0

我可以看到并且可以编辑这个文件,但是我找不到一种方法来去除JFIF声明之前的所有内容,或者仅仅去除头部信息。 - Carl Rendell
只需使用.search和切片,在源文件中,你可能会发现图像字符串在文件中的位置是固定的,因此可以安全地仅对图像字符串进行切片imagestring[161:] - JeffUK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接