我从SQL Server收到一个JSON文件,其中包含图像的字符串表示,我需要将其保存到磁盘上。
JSON流采用Base64编码,并使用“FOR JSON AUTO”进行编码 - 以下是生成JSON的SP,其中图像已存储在数据库中:
我可以使用base64对字符串进行解码,但是通过PIL读取的结果字节不能作为图像读取。
阅读字节数据似乎有一个带有“ System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”和“System.Drawing.Bitmap”的标头,但该文件未按我所期望的位图(bmp)格式读取。
我还比较了一些bmp图像文件,并没有在文件中找到那些“System.Drawing”和/或“System.Drawing.Bitmap”字符串。
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图像的问题没有得到解决,但我不需要为我的应用程序解决这个问题。