将二进制图像数据转换为图像并在HTML中显示

4
我正在使用Musicbrainz API的Python库Musicbrainsngs。对于某些专辑封面,发出请求。
import musicbrainzngs as mb

release_group_ID = '5c14fd50-a2f1-3672-9537-b0dad91bea2f'
artwork = mb.get_release_group_image_front(release_group_ID)
print(artwork)
文档中说它将返回一个字符串形式的二进制图像数据。

我的问题是: 这是什么类型的数据-(Base 64编码的PNG?如何判断?)

但更重要的是- 我该怎么办?如何将其保存为图像,或使用HTML显示为图像?

图像数据有1mm个字符- 这是开头的简短示例:

b'x16\x00\xe0}\xc1\x17\xfb_U{R\xd43uL\xbf\xe33\xec3e(,\xa7p\x00\xa2+\x02   \x9c\x92\xb6\x0b\x00\x07\xf9x\xeaa\xd5\x99 i\xab$\xe2\x92\xa3Co\xb9`\xb9\x1cd\x911\x01[\x0c\xd0\x9c\xaa\x81\x08Q|\x13\xe4\xd9:c\xa47\xfe\xca*q\xf5\xd4O\xea\x0fi\x9c\xcc\xf8u\x88\x0b\x16\x11m?#F\x9d\x9a\xe8}I&\xfe\xb5]t\xcf\xf0\x1f\xeb\xce\x9d\xa4iy^\x8b\xf7;2cde\xac\xd0\xc9\x12\x7f<I$)\rI\x90\xe3j\xc2!D\xdbg\xfe&\xf2:"rl;)\x98\n\x80\x9e \x1fS\x8e\x87\xce\xaa\xe0\x8a\xc2\x9b\'

从查看musicbranzngs的代码来看,很难确定如何告诉API返回了什么,这一点非常模糊。在其最简单的形式中,它向API发送HTTP请求,然后提供被返回的原始数据。我猜你可以将其写入某种虚拟文件描述符中。 - mustachioed
同意。本来希望能使用该库,但你说得对。最简单的方法就是绕过这个方法,直接调用API。我会这样做的。至于UTF-8,我的理解是它只适用于文本文件,而不是图像。 - Will
是的,这正是我在想的。要么重写 get_image 代码以返回响应对象,然后从那里开始工作。 - mustachioed
导入 base64....base64.decodestring(image_str)...阅读一下这篇简短的教程,也许会有所帮助:https://code.tutsplus.com/tutorials/base64-encoding-and-decoding-using-python--cms-25588 - johnashu
1个回答

1

看起来API没有填充这些信息。

备选方案1

将二进制数据按原样写入文件(以二进制模式)。然后使用magic(libmagic的包装器)确定mime类型。然后相应地重命名。

#! /usr/bin/python
# -*- coding: utf-8 -*-

import musicbrainzngs as mb
import magic
import os

release_group_ID = '5c14fd50-a2f1-3672-9537-b0dad91bea2f'
artwork = mb.get_release_group_image_front(release_group_ID)

result_file = 'result_file'

with open(result_file, 'wb') as file_handler:
    file_handler.write(artwork)

mime = magic.Magic(mime=True)
mime_type = mime.from_file(result_file)

if mime_type == 'image/jpeg':
    os.rename(result_file, result_file + '.jpg')
elif mime_type == 'image/png':
    os.rename(result_file, result_file + '.png')
elif mime_type == 'image/gif':
    os.rename(result_file, result_file + '.gif')
elif mime_type == 'image/bmp':
    os.rename(result_file, result_file + '.bmp')
elif mime_type == 'image/tiff':
    os.rename(result_file, result_file + '.tiff')
else:
    print('Not an image? %s' % mime_type)

替代方案2

直接将二进制数据写入文件(以二进制模式),然后使用PIL打开并以实际需要的格式保存(PIL不关心输入图像的格式,支持约80种不同格式)。最后删除原始文件。

#! /usr/bin/python
# -*- coding: utf-8 -*-

import musicbrainzngs as mb
from PIL import Image
import os

release_group_ID = '5c14fd50-a2f1-3672-9537-b0dad91bea2f'
artwork = mb.get_release_group_image_front(release_group_ID)

result_file = 'result_file'

with open(result_file, 'wb') as file_handler:
    file_handler.write(artwork)

Image.open(result_file).save(result_file + '.png', 'PNG')

os.remove(result_file)

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