thumbnail cache

This commit is contained in:
2020-02-04 15:05:23 +01:00
parent f29a2e57ec
commit 7ffe4e36af
3 changed files with 116 additions and 101 deletions
+113 -99
View File
@@ -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<const uchar*>(previewImage.pData()), static_cast<qint32>(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<const uchar*>(previewImage.pData()), static_cast<qint32>(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<const uchar*>(previewImage.pData()), static_cast<qint32>(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<const uchar*>(previewImage.pData()), static_cast<qint32>(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<const uchar*>(previewImage.pData()), static_cast<qint32>(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<const uchar*>(previewImage.pData()), static_cast<qint32>(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);
}
+2 -1
View File
@@ -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
+1 -1
View File
@@ -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;