/*! \file cpicture.cpp */ #include "common.h" #include "cexif.h" #include "cpicture.h" #include #include #include #include cPicture::cPicture(qint32 iID, QObject *parent) : QObject(parent), m_iID(iID), m_szFileName(""), m_szFilePath(""), m_iFileSize(0), m_mimeType(""), m_imageWidth(0), m_imageHeight(0), m_cameraMake(""), m_cameraModel(""), m_fNumber(""), m_iso(0), m_flash(""), m_flashID(0), m_focalLength(0.0), m_lensMake(""), m_lensModel(""), m_exposureTime(""), m_exposureBias(0), m_exifVersion(""), m_whiteBalance(0), m_focalLength35(0.0), m_gps(""), m_duration(0) { } bool cPicture::fromFile(const QString& szFileName) { cEXIF exif; QFileInfo fileInfo(szFileName); if(!exif.fromFile(szFileName)) return(false); m_iID = -1; m_szFileName = fileInfo.fileName(); m_szFilePath = fileInfo.absolutePath(); m_iFileSize = fileInfo.size(); m_thumbnail = exif.thumbnail(); m_mimeType = exif.mimeType(); m_imageWidth = exif.imageWidth(); m_imageHeight = exif.imageHeight(); m_imageOrientation = exif.imageOrientation(); m_cameraMake = exif.cameraMake().simplified(); m_cameraModel = exif.cameraModel().simplified(); m_dateTime = exif.dateTime(); m_fNumber = exif.fNumber(); m_iso = exif.iso(); m_flash = exif.flash().simplified(); m_flashID = exif.flashID(); m_focalLength = exif.focalLength(); m_lensMake = exif.lensMake().simplified(); m_lensModel = exif.lensModel().simplified(); m_exposureTime = exif.exposureTime(); m_exposureBias = exif.exposureBias(); m_exifVersion = exif.exifVersion(); m_dateTimeOriginal = exif.dateTimeOriginal(); m_dateTimeDigitized = exif.dateTimeDigitized(); m_whiteBalance = exif.whiteBalance(); m_focalLength35 = exif.focalLength35(); m_gps = exif.gps(); m_duration = exif.duration().toLongLong(); return(true); } bool cPicture::toDB() { QSqlQuery query; if(m_iID != -1) { query.prepare("SELECT id FROM picture WHERE id=:id;"); query.bindValue(":id", m_iID); if(!query.exec()) { myDebug << query.lastError().text(); return(false); } if(!query.next()) query.prepare("INSERT INTO picture (fileName, filePath, fileSize, mimeType, imageWidth, imageHeight, imageOrientation, cameraMake, cameraModel, dateTime, fNumber, iso, flashID, focalLength, lensMake, lensModel, exposureTime, exposureBias, exifVersion, dateTimeOriginal, dateTimeDigitized, whiteBalance, focalLength35, gps, duration, thumbnail) VALUES (:fileName, :filePath, :fileSize, :mimeType, :imageWidth, :imageHeight, :imageOrientation, :cameraMake, :cameraModel, :dateTime, :fNumber, :iso, :flashID, :focalLength, :lensMake, :lensModel, :exposureTime, :exposureBias, :exifVersion, :dateTimeOriginal, :dateTimeDigitized, :whiteBalance, :focalLength35, :gps, :duration, :thumbnail);"); else query.prepare("UPDATE picture SET fileName=:fileName, filePath=:filePath, fileSize=:fileSize, mimeType=:mimeType, imageWidth=:imageWidth, imageHeight=:imageHeight, imageOrientation=:imageOrientation, cameraMake=:cameraMake, cameraModel=:cameraModel, dateTime=:dateTime, fNumber=:fNumber, iso=:iso, flashID=:flashID, focalLength=:focalLength, lensMake=:lensMake, lensModel=:lensModel, exposureTime=:exposureTime, exposureBias=:exposureBias, exifVersion=:exifVersion, dateTimeOriginal=:dateTimeOriginal, dateTimeDigitized=:dateTimeDigitized, whiteBalance=:whiteBalance, focalLength35=:focalLength35, gps=:gps, duration=:duration, thumbnail=:thumbnail WHERE id=:id;"); } else query.prepare("INSERT INTO picture (fileName, filePath, fileSize, mimeType, imageWidth, imageHeight, imageOrientation, cameraMake, cameraModel, dateTime, fNumber, iso, flashID, focalLength, lensMake, lensModel, exposureTime, exposureBias, exifVersion, dateTimeOriginal, dateTimeDigitized, whiteBalance, focalLength35, gps, duration, thumbnail) VALUES (:fileName, :filePath, :fileSize, :mimeType, :imageWidth, :imageHeight, :imageOrientation, :cameraMake, :cameraModel, :dateTime, :fNumber, :iso, :flashID, :focalLength, :lensMake, :lensModel, :exposureTime, :exposureBias, :exifVersion, :dateTimeOriginal, :dateTimeDigitized, :whiteBalance, :focalLength35, :gps, :duration, :thumbnail);"); query.bindValue(":id", m_iID); query.bindValue(":fileName", m_szFileName); query.bindValue(":filePath", m_szFilePath); query.bindValue(":fileSize", m_iFileSize); query.bindValue(":mimeType", m_mimeType); query.bindValue(":imageWidth", m_imageWidth); query.bindValue(":imageHeight", m_imageHeight); query.bindValue(":imageOrientation", m_imageOrientation); query.bindValue(":cameraMake", m_cameraMake); query.bindValue(":cameraModel", m_cameraModel); query.bindValue(":dateTime", m_dateTime); query.bindValue(":fNumber", m_fNumber); query.bindValue(":iso", m_iso); query.bindValue(":flashID", m_flashID); query.bindValue(":focalLength", m_focalLength); query.bindValue(":lensMake", m_lensMake); query.bindValue(":lensModel", m_lensModel); query.bindValue(":exposureTime", m_exposureTime); query.bindValue(":exposureBias", m_exposureBias); query.bindValue(":exifVersion", m_exifVersion); query.bindValue(":dateTimeOriginal", m_dateTimeOriginal); query.bindValue(":dateTimeDigitized", m_dateTimeDigitized); query.bindValue(":whiteBalance", m_whiteBalance); query.bindValue(":focalLength35", m_focalLength35); query.bindValue(":gps", m_gps); query.bindValue(":duration", m_duration); if(!m_thumbnail.isNull()) query.bindValue(":thumbnail", image2Blob(m_thumbnail)); else query.bindValue(":thumbnail", QVariant(QVariant::ByteArray)); if(!query.exec()) { myDebug << query.lastError().text(); return(false); } if(m_iID == -1) { query.prepare("SELECT id FROM picture WHERE _rowid_=(SELECT MAX(_rowid_) FROM picture);"); if(!query.exec()) { myDebug << query.lastError().text(); return(false); } query.next(); m_iID = query.value("id").toInt(); } return(true); } void cPicture::setID(const qint32& id) { m_iID = id; } qint32 cPicture::id() { return(m_iID); } void cPicture::setMimeType(const QString &mimeType) { m_mimeType = mimeType; } QString cPicture::mimeType() { return(m_mimeType); } void cPicture::setImageWidth(const qint32& imageWidth) { m_imageWidth = imageWidth; } qint32 cPicture::imageWidth() { return(m_imageWidth); } void cPicture::setImageHeight(const qint32& imageHeight) { m_imageHeight = imageHeight; } qint32 cPicture::imageHeight() { return(m_imageHeight); } void cPicture::setImageOrientation(const qint16& imageOrientation) { m_imageOrientation = imageOrientation; } qint16 cPicture::imageOrientation() { return(m_imageOrientation); } void cPicture::setCameraMake(const QString& cameraMake) { m_cameraMake = cameraMake; } QString cPicture::cameraMake() { return(m_cameraMake); } void cPicture::setCameraModel(const QString& cameraModel) { m_cameraModel = cameraModel; } QString cPicture::cameraModel() { return(m_cameraModel); } void cPicture::setDateTime(const QDateTime& dateTime) { m_dateTime = dateTime; } QDateTime cPicture::dateTime() { return(m_dateTime); } void cPicture::setFNumber(const QString& fNumber) { m_fNumber = fNumber; } QString cPicture::fNumber() { return(m_fNumber); } void cPicture::setISO(const qint32& iso) { m_iso = iso; } qint32 cPicture::iso() { return(m_iso); } void cPicture::setFlash(const QString& flash) { m_flash = flash; } QString cPicture::flash() { return(m_flash); } void cPicture::setFlashID(const qint32& flashID) { m_flashID = flashID; } qint32 cPicture::flashID() { return(m_flashID); } void cPicture::setFocalLength(const qreal& focalLength) { m_focalLength = focalLength; } qreal cPicture::focalLength() { return(m_focalLength); } void cPicture::setLensMake(const QString& lensMake) { m_lensMake = lensMake; } QString cPicture::lensMake() { return(m_lensMake); } void cPicture::setLensModel(const QString& lensModel) { m_lensModel = lensModel; } QString cPicture::lensModel() { return(m_lensModel); } void cPicture::setExposureTime(const QString& exposureTime) { m_exposureTime = exposureTime; } QString cPicture::exposureTime() { return(m_exposureTime); } void cPicture::setExposureBias(const qint32& exposureBias) { m_exposureBias = exposureBias; } qint32 cPicture::exposureBias() { return(m_exposureBias); } void cPicture::setExifVersion(const QString& exifVersion) { m_exifVersion = exifVersion; } QString cPicture::exifVersion() { return(m_exifVersion); } void cPicture::setDateTimeOriginal(const QDateTime& dateTimeOriginal) { m_dateTimeOriginal = dateTimeOriginal; } QDateTime cPicture::dateTimeOriginal() { return(m_dateTimeOriginal); } void cPicture::setDateTimeDigitized(const QDateTime& dateTimeDigitized) { m_dateTimeDigitized = dateTimeDigitized; } QDateTime cPicture::dateTimeDigitized() { return(m_dateTimeDigitized); } void cPicture::setWhiteBalance(const qint32& whiteBalance) { m_whiteBalance = whiteBalance; } qint32 cPicture::whiteBalance() { return(m_whiteBalance); } void cPicture::setFocalLength35(const qreal& focalLength35) { m_focalLength35 = focalLength35; } qreal cPicture::focalLength35() { return(m_focalLength35); } void cPicture::setGPS(const QString& gps) { m_gps = gps; } QString cPicture::gps() { return(m_gps); } void cPicture::setDuration(const qint64& duration) { m_duration = duration; } qint64 cPicture::duration() { return(m_duration); } void cPicture::setFileName(const QString& fileName) { m_szFileName = fileName; } QString cPicture::fileName() { return(m_szFileName); } void cPicture::setFilePath(const QString& filePath) { m_szFilePath = filePath; } QString cPicture::filePath() { return(m_szFilePath); } void cPicture::setFileSize(const qint64& fileSize) { m_iFileSize = fileSize; } qint64 cPicture::fileSize() { return(m_iFileSize); } void cPicture::setThumbnail(const QImage& thumbnail) { m_thumbnail = thumbnail; } QImage cPicture::thumbnail() { return(m_thumbnail); } bool cPicture::operator==(const cPicture& other) const { if(this->m_szFileName != other.m_szFileName) return(false); if(this->m_iFileSize != other.m_iFileSize) return(false); if(this->m_mimeType != other.m_mimeType) return(false); if(this->m_imageWidth != other.m_imageWidth) return(false); if(this->m_imageHeight != other.m_imageHeight) return(false); if(this->m_imageOrientation != other.m_imageOrientation) return(false); if(this->m_cameraMake != other.m_cameraMake) return(false); if(this->m_cameraModel != other.m_cameraModel) return(false); if(this->m_dateTime != other.m_dateTime) return(false); if(this->m_fNumber != other.m_fNumber) return(false); if(this->m_iso != other.m_iso) return(false); if(this->m_flashID != other.m_flashID) return(false); if(this->m_focalLength != other.m_focalLength) return(false); if(this->m_lensMake != other.m_lensMake) return(false); if(this->m_lensModel != other.m_lensModel) return(false); if(this->m_exposureTime != other.m_exposureTime) return(false); if(this->m_exposureBias != other.m_exposureBias) return(false); if(this->m_exifVersion != other.m_exifVersion) return(false); if(this->m_dateTimeOriginal != other.m_dateTimeOriginal) return(false); if(this->m_dateTimeDigitized != other.m_dateTimeDigitized) return(false); if(this->m_whiteBalance != other.m_whiteBalance) return(false); if(this->m_focalLength35 != other.m_focalLength35) return(false); if(this->m_gps != other.m_gps) return(false); if(this->m_duration != other.m_duration) return(false); return(true); } bool cPicture::operator==(const cPicture*& other) const { if(this->m_szFileName != other->m_szFileName) return(false); if(this->m_iFileSize != other->m_iFileSize) return(false); if(this->m_mimeType != other->m_mimeType) return(false); if(this->m_imageWidth != other->m_imageWidth) return(false); if(this->m_imageHeight != other->m_imageHeight) return(false); if(this->m_imageOrientation != other->m_imageOrientation) return(false); if(this->m_cameraMake != other->m_cameraMake) return(false); if(this->m_cameraModel != other->m_cameraModel) return(false); if(this->m_dateTime != other->m_dateTime) return(false); if(this->m_fNumber != other->m_fNumber) return(false); if(this->m_iso != other->m_iso) return(false); if(this->m_flashID != other->m_flashID) return(false); if(this->m_focalLength != other->m_focalLength) return(false); if(this->m_lensMake != other->m_lensMake) return(false); if(this->m_lensModel != other->m_lensModel) return(false); if(this->m_exposureTime != other->m_exposureTime) return(false); if(this->m_exposureBias != other->m_exposureBias) return(false); if(this->m_exifVersion != other->m_exifVersion) return(false); if(this->m_dateTimeOriginal != other->m_dateTimeOriginal) return(false); if(this->m_dateTimeDigitized != other->m_dateTimeDigitized) return(false); if(this->m_whiteBalance != other->m_whiteBalance) return(false); if(this->m_focalLength35 != other->m_focalLength35) return(false); if(this->m_gps != other->m_gps) return(false); if(this->m_duration != other->m_duration) return(false); return(true); } bool cPicture::operator==(const cPicture* other) const { if(this->m_szFileName != other->m_szFileName) return(false); if(this->m_iFileSize != other->m_iFileSize) return(false); if(this->m_mimeType != other->m_mimeType) return(false); if(this->m_imageWidth != other->m_imageWidth) return(false); if(this->m_imageHeight != other->m_imageHeight) return(false); if(this->m_imageOrientation != other->m_imageOrientation) return(false); if(this->m_cameraMake != other->m_cameraMake) return(false); if(this->m_cameraModel != other->m_cameraModel) return(false); if(this->m_dateTime != other->m_dateTime) return(false); if(this->m_fNumber != other->m_fNumber) return(false); if(this->m_iso != other->m_iso) return(false); if(this->m_flashID != other->m_flashID) return(false); if(this->m_focalLength != other->m_focalLength) return(false); if(this->m_lensMake != other->m_lensMake) return(false); if(this->m_lensModel != other->m_lensModel) return(false); if(this->m_exposureTime != other->m_exposureTime) return(false); if(this->m_exposureBias != other->m_exposureBias) return(false); if(this->m_exifVersion != other->m_exifVersion) return(false); if(this->m_dateTimeOriginal != other->m_dateTimeOriginal) return(false); if(this->m_dateTimeDigitized != other->m_dateTimeDigitized) return(false); if(this->m_whiteBalance != other->m_whiteBalance) return(false); if(this->m_focalLength35 != other->m_focalLength35) return(false); if(this->m_gps != other->m_gps) return(false); if(this->m_duration != other->m_duration) return(false); return(true); } bool cPicture::operator==(cPicture* other) { if(this->m_szFileName != other->m_szFileName) return(false); if(this->m_iFileSize != other->m_iFileSize) return(false); if(this->m_mimeType != other->m_mimeType) return(false); if(this->m_imageWidth != other->m_imageWidth) return(false); if(this->m_imageHeight != other->m_imageHeight) return(false); if(this->m_imageOrientation != other->m_imageOrientation) return(false); if(this->m_cameraMake != other->m_cameraMake) return(false); if(this->m_cameraModel != other->m_cameraModel) return(false); if(this->m_dateTime != other->m_dateTime) return(false); if(this->m_fNumber != other->m_fNumber) return(false); if(this->m_iso != other->m_iso) return(false); if(this->m_flashID != other->m_flashID) return(false); if(this->m_focalLength != other->m_focalLength) return(false); if(this->m_lensMake != other->m_lensMake) return(false); if(this->m_lensModel != other->m_lensModel) return(false); if(this->m_exposureTime != other->m_exposureTime) return(false); if(this->m_exposureBias != other->m_exposureBias) return(false); if(this->m_exifVersion != other->m_exifVersion) return(false); if(this->m_dateTimeOriginal != other->m_dateTimeOriginal) return(false); if(this->m_dateTimeDigitized != other->m_dateTimeDigitized) return(false); if(this->m_whiteBalance != other->m_whiteBalance) return(false); if(this->m_focalLength35 != other->m_focalLength35) return(false); if(this->m_gps != other->m_gps) return(false); if(this->m_duration != other->m_duration) return(false); return(true); } cPictureList::cPictureList(QObject *parent) : QObject(parent) { } bool cPictureList::load(cSplashScreen *lpSplashScreen, QProgressBar *lpProgressBar) { cEXIFFlashList flashList; QSqlQuery query; query.prepare("SELECT COUNT(1) cnt FROM picture;"); if(!query.exec()) { myDebug << query.lastError().text(); return(false); } query.next(); qint32 max = static_cast(query.value("cnt").toLongLong()); if(lpProgressBar) lpProgressBar->setMaximum(max); else if(lpSplashScreen) lpSplashScreen->setMax(max); query.prepare("SELECT id, " " fileName, " " filePath, " " fileSize, " " mimeType, " " imageWidth, " " imageHeight, " " imageOrientation, " " cameraMake, " " cameraModel, " " dateTime, " " fNumber, " " iso, " " flashID, " " focalLength, " " lensMake, " " lensModel, " " exposureTime, " " exposureBias, " " exifVersion, " " dateTimeOriginal, " " dateTimeDigitized, " " whiteBalance, " " focalLength35, " " gps, " " duration, " " thumbnail " "FROM picture " "ORDER BY filePath, " " UPPER(fileName);"); if(!query.exec()) { myDebug << query.lastError().text(); return(false); } qint32 count = 0; qint32 step = max/200; if(!step) step = 1; while(query.next()) { cPicture* lpPicture = add(query.value("id").toInt(), true); lpPicture->setFileName(query.value("fileName").toString()); lpPicture->setFilePath(query.value("filePath").toString()); lpPicture->setFileSize(query.value("fileSize").toLongLong()); lpPicture->setMimeType(query.value("mimeType").toString()); lpPicture->setImageWidth(query.value("imageWidth").toInt()); lpPicture->setImageHeight(query.value("imageHeight").toInt()); lpPicture->setImageOrientation(static_cast(query.value("imageOrientation").toInt())); lpPicture->setCameraMake(query.value("cameraMake").toString()); lpPicture->setCameraModel(query.value("cameraModel").toString()); lpPicture->setDateTime(query.value("dateTime").toDateTime()); lpPicture->setFNumber(query.value("fNumber").toString()); lpPicture->setISO(query.value("iso").toInt()); lpPicture->setFlashID(query.value("flashID").toInt()); lpPicture->setFlash(flashList.flash(query.value("flashID").toInt())); lpPicture->setFocalLength(query.value("focalLength").toDouble()); lpPicture->setLensMake(query.value("lensMake").toString()); lpPicture->setLensModel(query.value("lensModel").toString()); lpPicture->setExposureTime(query.value("exposureTime").toString()); lpPicture->setExposureBias(query.value("exposureBias").toInt()); lpPicture->setExifVersion(query.value("exifVersion").toString()); lpPicture->setDateTimeOriginal(query.value("dateTimeOriginal").toDateTime()); lpPicture->setDateTimeDigitized(query.value("dateTimeDigitized").toDateTime()); lpPicture->setWhiteBalance(query.value("whiteBalance").toInt()); lpPicture->setFocalLength35(query.value("focalLength35").toDouble()); lpPicture->setGPS(query.value("gps").toString()); lpPicture->setDuration(query.value("duration").toLongLong()); lpPicture->setThumbnail(blob2Image(query.value("thumbnail").toByteArray())); count++; if(!(count % step)) { if(lpProgressBar) lpProgressBar->setValue(count); else if(lpSplashScreen) lpSplashScreen->setProgress(count); qApp->processEvents(); } } return(true); } cPicture* cPictureList::add(qint32 iID, bool bNoCheck) { if(iID != -1 && !bNoCheck) { if(find(iID)) return(nullptr); } cPicture* lpNew = new cPicture(iID); append(lpNew); return(lpNew); } bool cPictureList::add(cPicture* lpPicture, bool bNoCheck) { if(bNoCheck) { append(lpPicture); return(true); } if(contains(lpPicture)) return(false); append(lpPicture); return(true); } cPicture* cPictureList::find(qint32 iID) { for(int i = 0;i < count();i++) { if(at(i)->id() == iID) return(at(i)); } return(nullptr); } cPicture* cPictureList::find(cPicture* lpPicture) { for(int i = 0;i < count();i++) { if(*lpPicture == *at(i)) return(at(i)); } return(nullptr); }