[Digikam-devel] extragear/graphics/digikam

Gilles Caulier caulier.gilles at free.fr
Fri May 12 21:50:32 BST 2006


SVN commit 540279 by cgilles:

digikam from trunk : 

- New DMetadata method to set Exif thumbnail.
- New DMetadata method to set Exif Image dimensions.
- CameraGUI : Exif auto rotate update Exif image dimensions and Thumbnail during download.
- ImageEditor : update Exif image dimensions and Thumbnail during save picture operation.

CCMAIL: digikam-devel at kde.org

 M  +26 -3     libs/dmetadata/dmetadata.cpp  
 M  +1 -0      libs/dmetadata/dmetadata.h  
 M  +17 -1     libs/jpegutils/exifrotate.cpp  
 M  +10 -3     utilities/imageeditor/canvas/dimginterface.cpp  


--- trunk/extragear/graphics/digikam/libs/dmetadata/dmetadata.cpp #540278:540279
@@ -34,6 +34,7 @@
 // KDE includes.
 
 #include <kdebug.h>
+#include <ktempfile.h>
 
 // Exiv2 includes.
 
@@ -319,14 +320,14 @@
         {
             if (fixOrientation)
             {
-                Exiv2::ExifKey key("Exif.Image.Orientation");
+                Exiv2::ExifKey key("Exif.Thumbnail.Orientation");
                 Exiv2::ExifData exifData(d->exifMetadata);
                 Exiv2::ExifData::iterator it = exifData.findKey(key);
                 if (it != exifData.end())
                 {
                     QWMatrix matrix;
                     long orientation = it->toLong();
-                    kdDebug() << " Exif Orientation: " << orientation << endl;
+                    kdDebug() << " Exif Thumbnail Orientation: " << orientation << endl;
                     
                     switch (orientation) 
                     {
@@ -374,7 +375,7 @@
     }
     catch( Exiv2::Error &e )
     {
-        kdDebug() << "Cannot parse Exif Thumbnail using Exiv2 (" 
+        kdDebug() << "Cannot get Exif Thumbnail using Exiv2 (" 
                   << QString::fromLocal8Bit(e.what().c_str())
                   << ")" << endl;
     }        
@@ -382,6 +383,28 @@
     return thumbnail;
 }
 
+bool DMetadata::setExifThumbnail(const QImage& thumb)
+{
+    try
+    {   
+        KTempFile thumbFile(QString::null, "DigikamDMetadataThumb");
+        thumbFile.setAutoDelete(true);
+        thumb.save(thumbFile.name(), "JPEG");
+
+        const std::string &fileName( (const char*)(QFile::encodeName(thumbFile.name())) );
+        d->exifMetadata.setJpegThumbnail( fileName );
+        return true;
+    }
+    catch( Exiv2::Error &e )
+    {
+        kdDebug() << "Cannot set Exif Thumbnail using Exiv2 (" 
+                  << QString::fromLocal8Bit(e.what().c_str())
+                  << ")" << endl;
+    }        
+    
+    return false;
+}
+
 QSize DMetadata::getImageDimensions()
 {
     if (d->exifMetadata.empty())
--- trunk/extragear/graphics/digikam/libs/dmetadata/dmetadata.h #540278:540279
@@ -95,6 +95,7 @@
     int              getImageRating() const;
     QStringList      getImageKeywords() const;
 
+    bool setExifThumbnail(const QImage& thumb);
     bool setImageDimensions(const QSize& size);
     bool setImageOrientation(ImageOrientation orientation);
     bool setImageDateTime(const QDateTime& dateTime);
--- trunk/extragear/graphics/digikam/libs/jpegutils/exifrotate.cpp #540278:540279
@@ -44,6 +44,7 @@
 #include <qcstring.h> 
 #include <qfile.h>
 #include <qfileinfo.h>
+#include <qimage.h>
 
 // KDE includes.
 
@@ -214,12 +215,27 @@
             fclose(input_file);
             fclose(output_file);
         
-            // reset the orientation of the temp file to normal
+            // -- Metadata operations ------------------------------------------------------
+
+            // Reset the Exif orientation tag of the temp image to normal
             kdDebug() << "ExifRotate: set Orientation tag to normal: " << file << endl;
             exifData.load(temp);
             exifData.setImageOrientation(DMetadata::ORIENTATION_NORMAL);
+
+            // Get the new image dimension of the temp image. Using a dummy QImage objet here 
+            // has a sense because the Exif dimension informations can be missing from original image.
+            // Get new dimensions with QImage will always work...
+            QImage img(temp);
+            exifData.setImageDimensions(img.size());
+
+            // Update the thumbnail.
+            QImage thumb = img.scale(160, 120, QImage::ScaleMin);
+            exifData.setExifThumbnail(thumb);
+
+            // We update all new metadata now...
             exifData.applyChanges();
         
+            // -----------------------------------------------------------------------------
             // set the file modification time of the temp file to that
             // of the original file
             struct stat st;
--- trunk/extragear/graphics/digikam/utilities/imageeditor/canvas/dimginterface.cpp #540278:540279
@@ -542,6 +542,14 @@
        d->image.setAttribute("compress", iofileSettings->TIFFCompression);
 
     d->savingFilename = fileName;
+
+    // update Exif thumbnail.
+    DMetadata meta;
+    meta.setExif(d->image.getExif());
+    QImage thumb = d->image.smoothScale(160, 120, QSize::ScaleMin).copyQImage();
+    meta.setExifThumbnail(thumb);
+    d->image.setExif(meta.getExif());
+
     d->thread->save(d->image, fileName, mimeType);
 }
 
@@ -551,9 +559,7 @@
         return;
 
     if (!success)
-    {
         kdWarning() << "error saving image '" << QFile::encodeName(filePath).data() << endl;
-    }
 
     emit signalImageSaved(filePath, success);
     emit signalUndoStateChanged(d->undoMan->anyMoreUndo(), d->undoMan->anyMoreRedo(), !d->undoMan->isAtOrigin());
@@ -588,9 +594,10 @@
 {
     DMetadata meta;
     meta.setExif(d->image.getExif());
+
+    // Update Exif Image dimensions.
     meta.setImageDimensions(d->image.size());
     d->image.setExif(meta.getExif());
-    // TODO: Update Exif Thumbnail here !
     
     emit signalModified();
     emit signalUndoStateChanged(d->undoMan->anyMoreUndo(), d->undoMan->anyMoreRedo(), !d->undoMan->isAtOrigin());



More information about the Digikam-devel mailing list