Преобразование изображения песни в формате mp3 из png в jpg

У меня есть множество песен, некоторые из которых содержат png изображений в метаданных, и мне нужно преобразовать их в jpg.

Я знаю, как преобразовать png изображения в jpg в целом, но в настоящее время я получаю доступ к метаданным, используя eyed3, который возвращает ImageFrame объекты, и я не знаю, как ими манипулировать. Я могу, например, получить доступ к типу изображения с помощью

print(img.mime_type)

который возвращает

image/png

но я не знаю, как продвигаться дальше. Очень наивно я попытался загрузить изображение с помощью OpenCV, но это либо несовместимый формат, либо я сделал это неправильно. И вообще я бы тоже не знал, как обновить старый образ новым!

Примечание. Пока я работаю с eyed3, вполне нормально, если я могу решить эту проблему любым другим способом.


person Pablo    schedule 16.02.2021    source источник


Ответы (1)


Наконец-то я смог решить эту проблему, хотя и не очень элегантно.

Первым шагом является загрузка изображения. По какой-то причине я не мог заставить это работать с 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")

Таким образом, последний шаг — загрузить изображение и установить его в качестве метаданных. У вас есть более подробная информация об этом шаге в этом ответе.:

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()
person Pablo    schedule 18.02.2021