EXIVSIMPLE_API void SetThumbnail(HIMAGE img, const BYTE *buffer, unsigned int size) { ImageWrapper *imgWrap = (ImageWrapper*)img; Exiv2::ExifData& exifData = imgWrap->image->exifData(); Exiv2::ExifThumb exifThumb(exifData); exifThumb.setJpegThumbnail(buffer, size); }
void Previewimage::edit(Image *image){ getWidget(); // avoid nullpointer exception if(widget->isUpdate()){ QImage thumbnail = image->getImage()->scaled(160, 120); QByteArray ba; QBuffer buffer(&ba); buffer.open(QIODevice::WriteOnly); thumbnail.save(&buffer, "JPG"); if(image->getExifData() == 0) image->setExifData(new Exiv2::ExifData()); Exiv2::ExifThumb exifThumb(*image->getExifData()); exifThumb.erase(); exifThumb.setJpegThumbnail((Exiv2::byte*)ba.constData() ,ba.size()); } else if (widget->isRemove()){ if(image->getExifData() == 0) image->setExifData(new Exiv2::ExifData()); Exiv2::ExifThumb exifThumb(*image->getExifData()); exifThumb.erase(); } else { } }
EXIVSIMPLE_API unsigned int GetThumbnail(HIMAGE img, BYTE *buffer, unsigned int size) { ImageWrapper *imgWrap = (ImageWrapper*)img; Exiv2::ExifData& exifData = imgWrap->image->exifData(); Exiv2::ExifThumb exifThumb(exifData); Exiv2::DataBuf buf = exifThumb.copy(); if (buf.size_ == 0) { return 0; } if (buf.size_ > (long)size) { return unsigned int(-1); } memcpy(buffer, buf.pData_, buf.size_); return buf.size_; }
void ExifTools::copyExif(const QString &sourceStr, const QString &destStr) { Exiv2::Image::AutoPtr sourceImageData = Exiv2::ImageFactory::open(QFile::encodeName(sourceStr).data()); sourceImageData->readMetadata(); Exiv2::ExifData exifData = sourceImageData->exifData(); Exiv2::IptcData iptcData = sourceImageData->iptcData(); Exiv2::ExifThumb exifThumb(exifData); exifThumb.erase(); Exiv2::Image::AutoPtr destImageData = Exiv2::ImageFactory::open(QFile::encodeName(destStr).data()); destImageData->setExifData(exifData); destImageData->setIptcData(iptcData); destImageData->writeMetadata(); }
QPixmap MediaBrowser::iconForImage(const QString & file, const QSize & size) { QPixmap cache; QDir path(QString("%1/%2").arg(AppSettings::cachePath()).arg(CACHE_DIR)); if(!path.exists()) QDir(AppSettings::cachePath()).mkdir(CACHE_DIR); QString cacheFile = QString("%1/%2/%3-%4x%5") .arg(AppSettings::cachePath()) .arg(CACHE_DIR) .arg(MD5::md5sum(file)) .arg(size.width()) .arg(size.height()); //QPixmap orig(file); //orig = orig.scaled(size,Qt::IgnoreAspectRatio,Qt::SmoothTransformation); //orig.detach(); //return orig; bool cacheFileModified = !QFile(cacheFile).exists() || QFileInfo(file).lastModified() >= QFileInfo(cacheFile).lastModified(); //qDebug() << "MediaBrowser::iconForImage: file:"<<file<<", size:"<<size<<", cacheFile: "<<cacheFile<<", cacheModified:"<<cacheFileModified; if(!QPixmapCache::find(cacheFile,cache) || cacheFileModified) { if(QFile(cacheFile).exists() && !cacheFileModified) { cache.load(cacheFile); QPixmapCache::insert(cacheFile,cache); // qDebug() << "MediaBrowser::iconForImage: file:"<<file<<", size:"<<size<<": hit DISK (loaded scaled from disk cache)"; } else { bool gotThumb = false; try { Exiv2::Image::AutoPtr exiv = Exiv2::ImageFactory::open(file.toStdString()); if(exiv.get() != 0) { exiv->readMetadata(); Exiv2::ExifData& exifData = exiv->exifData(); if (exifData.empty()) { // qDebug() << file << ": No Exif data found in the file"; } Exiv2::ExifThumb exifThumb(exifData); std::string thumbExt = exifThumb.extension(); if (thumbExt.empty()) { // qDebug() << file << ": Image does not contain an Exif thumbnail"; } else { Exiv2::DataBuf buf = exifThumb.copy(); if (buf.size_ != 0) { qDebug() << file << ": Attempting to load thumnail (" << exifThumb.mimeType() << ", " << buf.size_ << " Bytes)"; QPixmap thumb; if(!thumb.loadFromData(buf.pData_, buf.size_)) { qDebug() << file << "QPixmap::fromData() failed"; } else { QString rotateSensor = exifData["Exif.Image.Orientation"].toString().c_str(); int rotationFlag = rotateSensor.toInt(); int rotateDegrees = rotationFlag == 1 || rotationFlag == 2 ? 0 : rotationFlag == 7 || rotationFlag == 8 ? -90 : rotationFlag == 3 || rotationFlag == 4 ? -180 : rotationFlag == 5 || rotationFlag == 6 ? -270 : 0; QTransform t = QTransform().rotate(rotateDegrees); thumb = thumb.transformed(t); cache = thumb.scaled(size,Qt::KeepAspectRatio,Qt::SmoothTransformation); if(abs(rotateDegrees) == 90 || abs(rotateDegrees) == 270) { QPixmap centeredCache(size); centeredCache.fill(Qt::transparent); int pos = size.width() /2 - cache.width() / 2; QPainter painter(¢eredCache); painter.drawPixmap(pos,0,cache); cache = centeredCache; qDebug() << file << " * Centered rotated pixmap in frame"; } cache.save(cacheFile,"PNG"); //qDebug() << "MediaBrowser::iconForImage: file:"<<file<<", image file: caching to:"<<cacheFile<<" for "<<file; QPixmapCache::insert(cacheFile,cache); gotThumb = true; // qDebug() << file << ": Succesfully loaded Exiv thumnail and scaled to size, wrote to: "<<cacheFile; } } } } } catch (Exiv2::AnyError& e) { //std::cout << "Caught Exiv2 exception '" << e << "'\n"; //return -1; gotThumb = false; } if(!gotThumb) { QPixmap orig(file); if(orig.isNull()) { cache = QPixmap(); QPixmapCache::insert(cacheFile,cache); qDebug() << "MediaBrowser::iconForImage: file:"<<file<<", size:"<<size<<": load INVALID (Can't load original)"; } else { cache = orig.scaled(size,Qt::KeepAspectRatio,Qt::SmoothTransformation); cache.save(cacheFile,"PNG"); ////qDebug() << "MyQFileIconProvider::icon(): image file: caching to:"<<cacheFile<<" for "<<file; QPixmapCache::insert(cacheFile,cache); // qDebug() << "MediaBrowser::iconForImage: file:"<<file<<", size:"<<size<<": load GOOD (loaded original and scaled)"; //QApplication::processEvents(); } } } } else { //qDebug() << "MediaBrowser::iconForImage: file:"<<file<<", size:"<<size<<": hit RAM (scaled image already in ram)"; } //qDebug() << "MediaBrowser::data: iconForImage: file:"<<file<<", cacheKey:"<<cache.cacheKey(); return cache; }