Extracting picture from MP3 files via c++ interface

Started by ankalagon, March 17, 2018, 12:13:11 PM

Previous topic - Next topic

ankalagon

Hi there,

I'm using exiftool to create a music database. For this purpose I also want to store the coverart stored in the file.
I'm using this line to extract everything I need (It's a Qt-application:

TagInfo *info = et->ImageInfo(filepath.toStdString().c_str(),"-artist\n"
                                                                          "-album\n"
                                                                          "-title\n"
                                                                          "-genre\n"
                                                                          "-track\n"
                                                                          "-picture\n"
                                                                          "--a\n"
                                                                          "-e\n"
                                                                          "-b");

if (info) {
                    for (TagInfo *i=info->next; i; i=i->next) {

                        QString nameString= i->name;

                        if (nameString == "Picture") {
                            qDebug() << "Picture:";
                            picture = i->value;
                            qDebug() << "Pic Size:" << picture.size();
                        } else if (nameString == "Artist") {
                            qDebug() << "Artist:";
                            artist=i->value;
                            qDebug() << artist;
                        } else if (nameString == "Album") {
                            qDebug() << "Album:";
                            album=i->value;
                            qDebug() << album;
                        } else if (nameString == "Genre") {
                            qDebug() << "Genre:";
                            genre=i->value;
                            qDebug() << genre;
                        } else if (nameString == "Track") {
                            qDebug() << "Track:";
                            track=i->value;
                            qDebug() << track;
                        } else if (nameString == "Title") {
                            qDebug() << "Title:";
                            title=i->value;
                        }

                    }
                    ...


Everything works fine, except for the image, where the output is always a size for 4:

����


Does anyone have an idea what's going wrong here?
Any help would be welcome!  :)

Phil Harvey

I think the problem is that you are treating the picture as a string, so the binary data will be terminated at the first null.  To get the size of the picture, use i->valueLen.

- Phil
...where DIR is the name of a directory/folder containing the images.  On Mac/Linux/PowerShell, use single quotes (') instead of double quotes (") around arguments containing a dollar sign ($).

ankalagon

Omg, you're right.

I don't know why I didn't see that. *banging head on table*

Thank you very much for this quick answer!