将 mp3 歌曲图像从 png 转换为 jpg

问题描述

我有一组很多歌曲,其中一些在元数据中有 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()