diff --git a/cexif.cpp b/cexif.cpp index 73dcb7e..7f96674 100644 --- a/cexif.cpp +++ b/cexif.cpp @@ -39,16 +39,40 @@ void cEXIF::setCacheDB(QSqlDatabase* lpCacheDB) m_lpCacheDB = lpCacheDB; } -bool cEXIF::fromFile(const QString& szFileName) +bool cEXIF::fromFile(const QString& szFileName, bool thumbnailOnly) { if(!QFile::exists(szFileName)) return(false); + bool cache = false; + m_exifValueList.clear(); m_previewList.clear(); m_szFileName = ""; + if(m_lpCacheDB && m_lpCacheDB->isOpen()) + { + QSqlQuery query(*m_lpCacheDB); + QFileInfo fileInfo(szFileName); + + query.prepare("SELECT thumbnail FROM files WHERE fileName=:fileName AND fileSize=:fileSize AND fileDate=:fileDate;"); + query.bindValue(":fileName", szFileName); + query.bindValue(":fileSize", fileInfo.size()); + query.bindValue(":fileDate", fileInfo.birthTime()); + + if(!query.exec()) + qDebug() << query.lastError().text(); + else + { + if(query.first()) + { + m_thumbnail = blob2Image(query.value("thumbnail").toByteArray()); + cache = true; + } + } + } + try { Exiv2::Image::UniquePtr image = Exiv2::ImageFactory::open(szFileName.toLocal8Bit().toStdString()); @@ -83,16 +107,19 @@ bool cEXIF::fromFile(const QString& szFileName) } } - Exiv2::PreviewManager previewManager(*image); - Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties(); - - for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++) + if((thumbnailOnly && m_thumbnail.isNull()) || !thumbnailOnly) { - Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i); - QImage image; - image.loadFromData(static_cast(previewImage.pData()), static_cast(previewImage.size())); + Exiv2::PreviewManager previewManager(*image); + Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties(); - m_previewList.append(image); + for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++) + { + Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i); + QImage image; + image.loadFromData(static_cast(previewImage.pData()), static_cast(previewImage.size())); + + m_previewList.append(image); + } } } @@ -111,16 +138,19 @@ bool cEXIF::fromFile(const QString& szFileName) } } - Exiv2::PreviewManager previewManager(*image); - Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties(); - - for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++) + if((thumbnailOnly && m_thumbnail.isNull()) || !thumbnailOnly) { - Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i); - QImage image; - image.loadFromData(static_cast(previewImage.pData()), static_cast(previewImage.size())); + Exiv2::PreviewManager previewManager(*image); + Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties(); - m_previewList.append(image); + for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++) + { + Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i); + QImage image; + image.loadFromData(static_cast(previewImage.pData()), static_cast(previewImage.size())); + + m_previewList.append(image); + } } } @@ -140,16 +170,19 @@ bool cEXIF::fromFile(const QString& szFileName) } } - Exiv2::PreviewManager previewManager(*image); - Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties(); - - for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++) + if((thumbnailOnly && m_thumbnail.isNull()) || !thumbnailOnly) { - Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i); - QImage image; - image.loadFromData(static_cast(previewImage.pData()), static_cast(previewImage.size())); + Exiv2::PreviewManager previewManager(*image); + Exiv2::PreviewPropertiesList previewPropertiesList = previewManager.getPreviewProperties(); - m_previewList.append(image); + for(Exiv2::PreviewPropertiesList::const_iterator i = previewPropertiesList.begin();i != previewPropertiesList.end();i++) + { + Exiv2::PreviewImage previewImage = previewManager.getPreviewImage(*i); + QImage image; + image.loadFromData(static_cast(previewImage.pData()), static_cast(previewImage.size())); + + m_previewList.append(image); + } } } } @@ -159,89 +192,39 @@ bool cEXIF::fromFile(const QString& szFileName) return(false); } - if(!m_previewList.count()) + if(!m_previewList.count() && m_thumbnail.isNull()) { QImage image; - if(m_lpCacheDB && m_lpCacheDB->isOpen()) + if(image.load(szFileName)) { - QSqlQuery query(*m_lpCacheDB); - QFileInfo fileInfo(szFileName); + QTransform rotation; + int angle = 0; - query.prepare("SELECT thumbnail FROM files WHERE fileName=:fileName AND fileSize=:fileSize AND fileDate=:fileDate;"); - query.bindValue(":fileName", szFileName); - query.bindValue(":fileSize", fileInfo.size()); - query.bindValue(":fileDate", fileInfo.birthTime()); - - if(!query.exec()) - qDebug() << query.lastError().text(); - else + switch(imageOrientation()) { - if(query.first()) - image = blob2Image(query.value("thumbnail").toByteArray()); + case 8: + angle = 270; + break; + case 3: + angle = 180; + break; + case 6: + angle = 90; + break; } + + if(angle != 0) + { + rotation.rotate(angle); + image = image.transformed(rotation); + } + + m_thumbnail = image.scaled(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, Qt::KeepAspectRatio, Qt::SmoothTransformation); + m_previewList.append(m_thumbnail); } - if(image.isNull()) - { - if(image.load(szFileName)) - { - QTransform rotation; - int angle = 0; - - switch(imageOrientation()) - { - case 8: - angle = 270; - break; - case 3: - angle = 180; - break; - case 6: - angle = 90; - break; - } - - if(angle != 0) - { - rotation.rotate(angle); - image = image.transformed(rotation); - } - - m_thumbnail = image.scaled(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, Qt::KeepAspectRatio, Qt::SmoothTransformation); - - if(m_lpCacheDB && m_lpCacheDB->isOpen()) - { - QSqlQuery query(*m_lpCacheDB); - QFileInfo fileInfo(szFileName); - - query.prepare("SELECT COUNT(1) cnt FROM files WHERE fileName=:fileName AND fileSize=:fileSize AND fileDate=:fileDate;"); - query.bindValue(":fileName", szFileName); - query.bindValue(":fileSize", fileInfo.size()); - query.bindValue(":fileDate", fileInfo.birthTime()); - - if(!query.exec()) - qDebug() << query.lastError().text(); - else - { - query.first(); - if(!query.value("cnt").toInt()) - { - query.prepare("INSERT INTO files (fileName, fileSize, fileDate, cacheDate, thumbnail) VALUES (:fileName, :fileSize, :fileDate, DATETIME('now'), :thumbnail);"); - query.bindValue(":fileName", szFileName); - query.bindValue(":fileSize", fileInfo.size()); - query.bindValue(":fileDate", fileInfo.birthTime()); - query.bindValue(":thumbnail", image2Blob(m_thumbnail)); - - if(!query.exec()) - qDebug() << query.lastError().text(); - } - } - } - } - } - else - m_thumbnail = image; + m_previewList.append(m_thumbnail); } else { @@ -309,6 +292,37 @@ bool cEXIF::fromFile(const QString& szFileName) } } + + if(m_lpCacheDB && m_lpCacheDB->isOpen() && !cache && !m_thumbnail.isNull()) + { + QSqlQuery query(*m_lpCacheDB); + QFileInfo fileInfo(szFileName); + + query.prepare("SELECT COUNT(1) cnt FROM files WHERE fileName=:fileName AND fileSize=:fileSize AND fileDate=:fileDate;"); + + query.bindValue(":fileName", szFileName); + query.bindValue(":fileSize", fileInfo.size()); + query.bindValue(":fileDate", fileInfo.birthTime()); + + if(!query.exec()) + qDebug() << query.lastError().text(); + else + { + query.first(); + if(!query.value("cnt").toInt()) + { + query.prepare("INSERT INTO files (fileName, fileSize, fileDate, cacheDate, thumbnail) VALUES (:fileName, :fileSize, :fileDate, DATETIME('now'), :thumbnail);"); + query.bindValue(":fileName", szFileName); + query.bindValue(":fileSize", fileInfo.size()); + query.bindValue(":fileDate", fileInfo.birthTime()); + query.bindValue(":thumbnail", image2Blob(m_thumbnail)); + + if(!query.exec()) + qDebug() << query.lastError().text(); + } + } + } + return(true); } diff --git a/cexif.h b/cexif.h index 233d9c2..597ac10 100644 --- a/cexif.h +++ b/cexif.h @@ -622,9 +622,10 @@ public: \fn fromFile \param szFileName + \param thumbnailOnly \return bool */ - bool fromFile(const QString& szFileName); + bool fromFile(const QString& szFileName, bool thumbnailOnly = false); /*! \brief diff --git a/cfilebrowser.cpp b/cfilebrowser.cpp index 19cc9aa..8416554 100644 --- a/cfilebrowser.cpp +++ b/cfilebrowser.cpp @@ -121,7 +121,7 @@ void cFileBrowser::addFile(const QFileInfo& fileInfo) cEXIF* lpExif = new cEXIF(&m_exifTAGList, &m_exifCompressionList, &m_exifLightSourceList, &m_exifFlashList, &m_iptcTagList, &m_xmpTagList); lpExif->setCacheDB(&m_cacheDB); - if(!lpExif->fromFile(fileInfo.filePath())) + if(!lpExif->fromFile(fileInfo.filePath(), true)) { delete lpExif; return;