python - 在 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图像的问题没有解决,但我不需要为我的应用程序解决它。
解决方案
顺便说一句,看起来该文件实际上是 System.Drawing.Bitmap 对象的 .NET 二进制序列化。
格式的规范。
推荐阅读
- regex - 如何在 Emacs Lisp 中编写用于语法高亮的函数?
- git - Git hooks 强制消息格式
- javascript - 正则表达式验证 GMT 和中文日期时间格式
- tensorflow - 张量流如何*有效地*计算从输入到损失的梯度?
- r - 将长列表转换为具有重复项的二进制数据帧
- ios - 如何将 NSData 从 zipFile 转换为 char *
- c++ - 为浮点数组动态分配内存
- language-agnostic - 键入命令并立即执行的工作模式的名称
- mysql - 执行查询时出现错误 2003 Mysql 或错误代码:2013 在查询期间丢失与 MySQL 服务器的连接
- python - 如何将对象转换为可迭代(列表)?