2016-08-27 6 views
0

En Python3, je travaille sur une application musicale. J'utilise une bibliothèque appelée TinyTag pour obtenir des métadonnées à partir des fichiers musicaux, comme le titre et l'artiste. Il soutient également obtenir l'art d'album. Lorsque l'art est récupéré, il le charge comme ce que je crois est appelé un littéral octets (je ne suis pas familier avec elle). Je me demandais comment transformer ces données en une image. Voici le code:Python Convertir des octets littéraux en image

from tinytag import TinyTag 
tag = TinyTag.get("/path/to/file.mp3", image=True) 
image_data = tag.get_image() 
print(image_data) 

Les données d'image sont une piqûre massive précédée de la lettre "b". Il ressemble à ceci:

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

mais c'est beaucoup plus long. Comment puis-je convertir cela en image de couverture de l'album. Quelles bibliothèques sont nécessaires et comment peut-on le faire?

+0

Mais c'est déjà une image! Un JPEG, pour être exact. – usr2564301

Répondre

3

La chaîne que vous voyez est le contenu d'un fichier image. Vous pouvez simplement enregistrer la chaîne directement dans un fichier:

$ 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 

Si vous utilisez python3, vous devrez spécifier explicitement « wb » en mode, puisque vous obtenez un flux d'octets à la place:

$ 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 
+0

La seule chose qui m'appartient n'est pas juste une ficelle, c'est le b devant. Quand j'essaie d'écrire avec l'image_data je l'ai, donne une erreur "TypeError: write() l'argument doit être str, pas bytes". J'ai donc essayé d'utiliser la fonction str() pour convertir les données d'image en une chaîne qui ne donnait pas d'erreur lors de l'écriture, mais lorsque l'image est ouverte dans mon visualiseur d'image, cette erreur est donnée: un fichier JPEG: commence par 0x62 0x27) ". Comment puis-je réparer ça? –

+0

Ça a marché, merci. –