Qt - Как получить metadata у фотографии?

222
25 мая 2018, 09:50

Как мне извлечь мето данные широту и долготу у файла-картинки? Сейчас, когда я обрабатываю не один файл, а несколько выдаёт ошибку: no match for call to '(const QString) (const QString&)'

    filesLatitude.append(QMediaMetaData::GPSLatitude(Files.at(i)));
    filesLongitude.append(QMediaMetaData::GPSLongitude(Files.at(i))); 

Полная функция UploadPhotosVideo:

void MainWindow::UploadPhotosVideo(QString PhotosVideo) {
    if(PhotosVideo == "Photos") {
        Files = QFileDialog::getOpenFileNames(
                    this,
                    tr("Открыть файлы"),
                    "C://",
                    "Все файлы (*.*);;Файлы изображений (*.png *.jpg *.jpeg *.bmp)"
                    );
    } else if(PhotosVideo == "Video") {
        Files = QFileDialog::getOpenFileNames(
                    this,
                    tr("Открыть файлы"),
                    "C://",
                    "Все файлы (*.*);;Файлы видео (*.dv *.avi *.mpeg *.mov *.dvd *.flv *.mp4)"
                    );
    }
    Progress->show();
    Progress->setMinimum(0);
    Progress->setMaximum(Files.size()-1);
    Tab->setEnabled(false);
    QStringList filesName;
    QStringList filesLatitude;
    QStringList filesLongitude;
    QString newDir = QString(QDir::currentPath()+"/%1_%2").arg(QString(QDate::currentDate().toString()).replace(" ","_")).arg(QString(QTime::currentTime().toString()).replace(":","_"));
    QDir().mkdir(newDir);
    for (int i=0; i<Files.size();i++) {
        if(PhotosVideo == "Photos") {
            qDebug()<<"+++"<<Files.at(i);
            filesLatitude.append(QMediaMetaData::GPSLatitude(Files.at(i)));
            filesLongitude.append(QMediaMetaData::GPSLongitude(Files.at(i)));
        }
        filesName.append(QFileInfo(Files.at(i)).fileName());
        QFile::copy(Files.at(i),newDir+"/"+QFileInfo(Files.at(i)).fileName());
        Progress->setValue(i);
        msg_view->append("Файл:"+Files.at(i)+" СКОПИРОВАН В:"+newDir+"/"+QFileInfo(Files.at(i)).fileName());
    }
    Tab->setEnabled(true);
    Progress->hide();
    QDynamicButton *buttonUploadPhotos = (QDynamicButton*) sender();
    QList<QLineEdit*> _ListLineEditPhotos = buttonUploadPhotos->getListLineEdit();
    for (int i=0;i<_ListLineEditPhotos.count();i++)
        _ListLineEditPhotos[i]->setText(filesName.join(","));
}
Answer 1

QMediaObject наследует QAudioDecoder, QCamera, QMediaPlayer и QRadioTuner. Таким образом, не представляется возможным использовать QMediaMetaData для существующих фотографий JPEG и поэтому я использовал следующий код. Подключил два файла exif.cpp, exif.h и переделав код следующим образом:

   if(PhotosVideo == "Photos") {
        QString pathFile = imagePathListCopy.at(i); //тут пишем ссылку на файл 
        QByteArray pathFileBA = pathFile.toLocal8Bit();
        const char *pathFileChar = pathFileBA.data();
        // Read the JPEG file into a buffer
        FILE *fp = fopen(pathFileChar, "rb");
        if (!fp) {
            QMessageBox msgBox;
            msgBox.setText("Не удается открыть файл.\n");
            msgBox.exec();
            qDebug()<<"Не удается открыть файл.\n"<<pathFileChar;
        }
        fseek(fp, 0, SEEK_END);
        unsigned long fsize = ftell(fp);
        rewind(fp);
        unsigned char *buf = new unsigned char[fsize];
        if (fread(buf, 1, fsize, fp) != fsize) {
            QMessageBox msgBox;
            msgBox.setText("Не удается прочитать файл.\n");
            msgBox.exec();
            //qDebug()<<"Не удается прочитать файл.\n";
            delete[] buf;
        }
        fclose(fp);
        // Parse EXIF
        easyexif::EXIFInfo result;
        int code = result.parseFrom(buf, fsize);
        delete[] buf;
        if (code) {
            QMessageBox msgBox;
            msgBox.setText(QString("Ошибка анализа EXIF: код %1 \n").arg(code));
            msgBox.exec();
            //qDebug()<<QString("Ошибка анализа EXIF: код %1 \n").arg(code);
        }
        qDebug()<<"GPS Latitude"<<result.GeoLocation.Latitude;
        qDebug()<<"GPS Longitude"<<result.GeoLocation.Longitude;
        filesLatitude.append(QString::number(result.GeoLocation.Latitude));
        filesLongitude.append(QString::number(result.GeoLocation.Longitude));
    }

получил широту и долготу из методанных JPEG.

READ ALSO
Ввод односвязного списка

Ввод односвязного списка

Есть один небольшой вопросУ меня есть список с двумя полями данных (одно для буквы, а второе для числа)

210
Помогите написать функцию [закрыт]

Помогите написать функцию [закрыт]

В массиве А(N,M) строки, не содержащие четных элементов, расположить в порядке убывания сумм элементов

182
Вывод объектов на консоль

Вывод объектов на консоль

Вот такой вопрос, почему каждый раз ,то что я ввожу заменяется новыми введенными данными? Выводится на консоль только новая информация

237
Как в wxString записать ентер?

Как в wxString записать ентер?

Как ентер сделать частью wxString строки?

226