问题描述
我有一组很多歌曲,其中一些在元数据中有 png
图像,我需要将它们转换为 jpg
。
我通常知道如何将 png
图像转换为 jpg
,但我目前正在使用 eyed3
访问元数据,它返回 ImageFrame
对象,但我不知道如何操纵这些。例如,我可以使用
print(img.mime_type)
哪个返回
image/png
但我不知道如何从这里开始。我非常天真地尝试使用 OpenCV 加载图像,但它要么不是兼容的格式,要么我没有正确加载。无论如何,我也不知道如何用新图像更新旧图像!
注意:虽然我目前正在使用 eyed3
,但如果我能以任何其他方式解决这个问题,那就再好不过了。
解决方法
我终于能够解决这个问题,虽然方式不是很优雅。
第一步是加载图像。出于某种原因,我无法使用 eyed3
完成这项工作,但 TinyTag
可以完成这项工作:
from PIL import Image
from tinytag import TinyTag
tag = TinyTag.get(mp3_path,image=True)
image_data = tag.get_image()
img_bites = io.BytesIO(image_data)
photo = Image.open(im)
然后我操纵它。例如,我们可以调整它的大小并将其保存为 jpg
。因为我们在这些操作中使用了Pillow
(PIL
),所以我们实际上需要保存图片,最后加载回来得到二进制数据(这个细节大概是过程中应该改进的地方) .
photo = photo.resize((500,500)) # suppose we want 500 x 500 pixels
rgb_photo = photo.convert("RGB")
rgb_photo.save(temp_file_path,format="JPEG")
最后一步是加载图像并将其设置为元数据。您在 this answer 中有关于此步骤的更多详细信息。:
audio_file = eyed3.load(mp3_path) # this has been loaded before
audio_file.tag.images.set(
3,open(temp_file_path,"rb").read(),"image/jpeg"
)
audio_file.tag.save()