Python从json解码图像

2024-04-25 14:18:33 发布

您现在位置:Python中文网/ 问答频道 /正文

使用api和请求库

背景信息:创建与sms消息平台互操作的程序。api的所有响应都以json格式提供。当使用端点获取sms附件时,响应是json格式的,基本上是一大块编码文本

我能够发送适当的请求以获得我想要的响应,但我不知道如何处理响应

如何解码json并处理图像文件

完整的回复太长,无法在这里发布,但我认为任何重要的内容都包含在开头。。。我只是不知道该怎么办

b'{"id":1067442,"friendlyName":"attachment0","md5":"4dCsb2PEljAqYY1JBl3FXA==","contentType":"image/jpeg","size":1017241,"createdDate":1582649116340,"updatedDate":1582649116340,"thumbnailBase64":"/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACWAJYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDu1AwB29B/9al4BPr7f5/Gk7Dn86Xt/niuY1HZ5HApcZ6ikXpxxTvccUhABwD1/rUkZ2nHUUwc07GRkUrgTBfTp7U9QB0pEyyg96cxSNGkdwqqCxZjwB6+3elcLmfq19aaRCt/dSMqAGMqD97jI49eP1rz2bUdc8YGR7eaLS9EVtpup22ofYZxvP6VieMfFP8AbGrMu9RaRnbBEcksvqR2z/8AWrkpdRS7vIobi7mlSFdsUKnIX2FdEY6ak8x6zp/hDwhHEJbrUotQY9ZJbsBc+wUgfzrQi0XwUp+SHSH+ro38zXlkdzEBuYiOIDqzYAqvcahaO4W3thcTngNInC/nT5Q5j2iLQfD8ozb6fprD1jhQ4/IVTvfBGkz5aGFYj6xqB+nSvJrU3EUgeGcxSA53wHaQfwrttL+J/wBhtI7fWrZ5pFYoZ4mA3Y9Qcc/jScRqRHqHgu7sQ09oInRPmYL8mQPUdDVeLXWh037HJtLbt0cj9AOhUiux/wCEx0XUtFu5rS4/eLEcROMNk8DHY8ntXO+B9PXUb2+nlQNBHGIfmGQWY5P8h+dS1pqProUrfVBuCGOEjHy+W+P0NU9KeeDVL2a6sLiO2kHlrKUyD................

Tags: 文本程序api信息json消息编码附件
2条回答

像那样的东西可以达到目的

import json, base64

resp = b'{"id":1067442,"friendlyName":"attachment0","md5":"4dCsb2PEljAqYY1JBl3FXA==","contentType":"image/jpeg","size":1017241,"createdDate":1582649116340,"updatedDate":1582649116340,"thumbnailBase64":"/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgG...'
resp_dict = json.loads(resp)

with open("img.jpeg", "wb") as fp:
    content = base64.b64decode(resp_dict['thumbnailBase64'])
    fp.write(content)

此外,请记住,base64值可以直接用于将图像打印到HTML页面中

<div>
  <p>Taken from wikpedia</p>
  <img src="data:image/jpeg;base64, iVBORw0KGgoAAAANSUhEUgAAAAUA
    AAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO
        9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />
</div>

在所有情况下,您都需要检查content-type以正确解释您收到的数据。这并不总是jpeg格式,但可能是png、gif、tiff等格式

首先解析json字符串:

import json
response = b'{"id":1067442,"friendlyName":"attachment0","md5":"4dCsb2PEljAqYY1JBl3FXA==","contentType":"image/jpeg","size":1017241,"createdDate":1582649116340,"updatedDate":1582649116340,"thumbnailBase64":"/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACWAJYDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDu1AwB29B/9al4BPr7f5/Gk7Dn86Xt/niuY1HZ5HApcZ6ikXpxxTvccUhABwD1/rUkZ2nHUUwc07GRkUrgTBfTp7U9QB0pEyyg96cxSNGkdwqqCxZjwB6+3elcLmfq19aaRCt/dSMqAGMqD97jI49eP1rz2bUdc8YGR7eaLS9EVtpup22ofYZxvP6VieMfFP8AbGrMu9RaRnbBEcksvqR2z/8AWrkpdRS7vIobi7mlSFdsUKnIX2FdEY6ak8x6zp/hDwhHEJbrUotQY9ZJbsBc+wUgfzrQi0XwUp+SHSH+ro38zXlkdzEBuYiOIDqzYAqvcahaO4W3thcTngNInC/nT5Q5j2iLQfD8ozb6fprD1jhQ4/IVTvfBGkz5aGFYj6xqB+nSvJrU3EUgeGcxSA53wHaQfwrttL+J/wBhtI7fWrZ5pFYoZ4mA3Y9Qcc/jScRqRHqHgu7sQ09oInRPmYL8mQPUdDVeLXWh037HJtLbt0cj9AOhUiux/wCEx0XUtFu5rS4/eLEcROMNk8DHY8ntXO+B9PXUb2+nlQNBHGIfmGQWY5P8h+dS1pqProUrfVBuCGOEjHy+W+P0NU9KeeDVL2a6sLiO2kHlrKUyD................"}'
response_parsed = json.loads(response)

response_parsed['contentType']beingimage/jpeg向我们暗示图像的格式是jpeg

您没有向我们提供实际的图像数据,只是存储在thumbnailBase64中的图像缩略图的开头

缩略图用base64编码。我们可以使用base64.b64decode将base64字符串解码为字节:

from base64 import b64decode
thumbnail_bytes = b64decode(response_parsed['thumbnailBase64'])

现在有了缩略图字节,我们可以将其保存到文件中,并像查看任何常规图像文件一样查看它:

with open(r'thumbnail.jpg', 'wb') as x:
    x.write(thumbnail_bytes)

实际图像可能位于名为“image”或“imageData”或类似内容的JSON字段中。你没有把它包括在你的问题中,所以没有办法确定

这导致:

Partial thumbnail

显然,它已损坏,因为您只包含缩略图的开头

相关问题 更多 >

    热门问题