Python将字节文字转换为图像

Python将字节文字转换为图像,python,python-3.x,audio-player,Python,Python 3.x,Audio Player,在Python3中,我正在开发一个音乐播放应用程序。我正在使用一个名为TinyTag的库从音乐文件中获取元数据,如标题和艺术家。它还支持获得专辑艺术。当艺术被检索时,它以我认为被称为字节文字(我不熟悉)的方式加载它。我想知道如何将这些数据转换成图像。代码如下: from tinytag import TinyTag tag = TinyTag.get("/path/to/file.mp3", image=True) image_data = tag.get_image() print(image

在Python3中,我正在开发一个音乐播放应用程序。我正在使用一个名为TinyTag的库从音乐文件中获取元数据,如标题和艺术家。它还支持获得专辑艺术。当艺术被检索时,它以我认为被称为字节文字(我不熟悉)的方式加载它。我想知道如何将这些数据转换成图像。代码如下:

from tinytag import TinyTag
tag = TinyTag.get("/path/to/file.mp3", image=True)
image_data = tag.get_image()
print(image_data)
图像数据是一个以字母“b”开头的大量数据。看起来是这样的:

b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01...'

但是要长得多。如何将其转换为相册封面图像。需要哪些库以及如何实现?

您看到的字符串是图像文件的内容。您只需将字符串直接保存到文件:

$ file /tmp/file.mp3
/tmp/file.mp3: Audio file with ID3 version 2.3.0, contains: MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, JntStereo
$ ipython
Python 2.7.12 (default, Aug  9 2016, 15:48:18) 
Type "copyright", "credits" or "license" for more information.

IPython 3.2.1 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object', use 'object??' for extra details.

In [1]: from tinytag import TinyTag

In [2]: tag = TinyTag.get("/tmp/file.mp3", image=True)

In [3]: image_data = tag.get_image()

In [4]: type(image_data)
Out[4]: str

In [5]: image_data[:20]
Out[5]: '\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00'

In [6]: with open("/tmp/album_art.jpg", "w") as f:
   ...:     f.write(image_data)
   ...:   

In [7]: exit()
$ file /tmp/album_art.jpg
/tmp/album_art.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=7, orientation=upper-left, xresolution=98, yresolution=106, resolutionunit=2, software=Adobe Photoshop CS2 Windows, datetime=2008:04:02 00:23:04], baseline, precision 8, 320x300, frames 3
如果您使用的是python3,则必须在模式中显式指定“wb”,因为您得到的是字节流:

$ python3
Python 3.5.1 (default, Aug  9 2016, 15:35:51) 
[GCC 6.1.1 20160621 (Red Hat 6.1.1-3)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from tinytag import TinyTag
>>> tag = TinyTag.get("/tmp/file.mp3", image=True)
>>> image_data = tag.get_image()
>>> type(image_data)
<class 'bytes'>
>>> image_data[:20]
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00'
>>> with open("/tmp/album_art.jpg", "wb") as f:
...     f.write(image_data)
... 
64790
>>> exit()
$ file /tmp/album_art.jpg
/tmp/album_art.jpg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, Exif Standard: [TIFF image data, big-endian, direntries=7, orientation=upper-left, xresolution=98, yresolution=106, resolutionunit=2, software=Adobe Photoshop CS2 Windows, datetime=2008:04:02 00:23:04], baseline, precision 8, 320x300, frames 3
$python3
Python 3.5.1(默认,2016年8月9日,15:35:51)
linux上的[GCC 6.1.1 20160621(Red Hat 6.1.1-3)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>从tinytag进口tinytag
>>>tag=TinyTag.get(“/tmp/file.mp3”,image=True)
>>>image\u data=tag.get\u image()
>>>类型(图像数据)
>>>图像_数据[:20]
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x00H\x00H\x00\x00'
>>>以open(“/tmp/album_art.jpg”、“wb”)作为f:
...     f、 写入(图像数据)
... 
64790
>>>退出()
$file/tmp/album_art.jpg
/tmp/album_art.jpg:JPEG图像数据,JFIF标准1.01,分辨率(DPI),密度72x72,段长16,Exif标准:[TIFF图像数据,大端,direntries=7,方向=左上角,X分辨率=98,yresolution=106,分辨率单位=2,软件=Adobe Photoshop CS2 Windows,日期时间=2008:04:02 00:23:04],基线,精度8,320x300,第3帧

但它已经是图像了!确切地说是一个JPEG。我唯一的东西不只是一个字符串,它前面有一个b。当我尝试使用我拥有的图像_数据写入时,给出了一个错误“TypeError:write()参数必须是str,而不是bytes”。因此,我随后尝试使用str()函数将图像数据转换为字符串,写入时不会出现错误,但在图像查看器中打开图像时,会出现此错误:“错误解释JPEG图像文件(不是JPEG文件:以0x62 0x27开头)”。我该如何解决这个问题?