[Digikam-devel] extragear/graphics/digikam/libs/dimg/loaders
Gilles Caulier
caulier.gilles at free.fr
Mon May 29 12:07:29 BST 2006
SVN commit 546164 by cgilles:
digikam from trunk : DImg::TiffLoader : writting tiff thumbnail in directory IFD1
CCMAIL: digikam-devel at kde.org
M +62 -3 tiffloader.cpp
--- trunk/extragear/graphics/digikam/libs/dimg/loaders/tiffloader.cpp #546163:546164
@@ -7,6 +7,12 @@
* Copyright 2005 by Renchi Raju, Gilles Caulier
* Copyright 2006 by Gilles Caulier
*
+ * Specifications & references:
+ * - TIFF 6.0 : http://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf
+ * - TIFF/EP : http://www.map.tu.chiba-u.ac.jp/IEC/100/TA2/recdoc/N4378.pdf
+ * - TIFF/Tags : http://www.awaresystems.be/imaging/tiff/tifftags.html
+ * - DNG : http://www.adobe.com/products/dng/pdfs/dng_spec.pdf
+ *
* This program is free software; you can redistribute it
* and/or modify it under the terms of the GNU General
* Public License as published by the Free Software Foundation;
@@ -627,7 +633,7 @@
}
// -------------------------------------------------------------------
- // Write image data
+ // Write full image data in tiff directory IFD0
if (observer)
observer->progressInfo(m_image, 0.1);
@@ -644,7 +650,7 @@
if (!buf)
{
- kdDebug() << k_funcinfo << "Cannot allocate memory buffer." << endl;
+ kdDebug() << k_funcinfo << "Cannot allocate memory buffer for main image." << endl;
TIFFClose(tif);
return false;
}
@@ -734,7 +740,7 @@
if (!TIFFWriteScanline(tif, buf, y, 0))
{
- kdDebug() << k_funcinfo << "Cannot write to target file." << endl;
+ kdDebug() << k_funcinfo << "Cannot write main image to target file." << endl;
_TIFFfree(buf);
TIFFClose(tif);
return false;
@@ -742,6 +748,59 @@
}
_TIFFfree(buf);
+ TIFFWriteDirectory(tif);
+
+ // -------------------------------------------------------------------
+ // Write thumbnail in tiff directory IFD1
+
+ QImage thumb = m_image->smoothScale(160, 120, QSize::ScaleMin).copyQImage();
+
+ TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, thumb.width());
+ TIFFSetField(tif, TIFFTAG_IMAGELENGTH, thumb.height());
+ TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB);
+ TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
+ TIFFSetField(tif, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
+ TIFFSetField(tif, TIFFTAG_RESOLUTIONUNIT, RESUNIT_NONE);
+ TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_NONE);
+ TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 3);
+ TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
+ TIFFSetField(tif, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(tif, 0));
+
+ uchar *pixelThumb;
+ uchar *dataThumb = thumb.bits();
+ uint8 *bufThumb = (uint8 *) _TIFFmalloc(TIFFScanlineSize(tif));
+
+ if (!bufThumb)
+ {
+ kdDebug() << k_funcinfo << "Cannot allocate memory buffer for thumbnail." << endl;
+ TIFFClose(tif);
+ return false;
+ }
+
+ for (y = 0 ; y < uint32(thumb.height()) ; y++)
+ {
+ i = 0;
+
+ for (x = 0 ; x < uint32(thumb.width()) ; x++)
+ {
+ pixelThumb = &dataThumb[((y * thumb.width()) + x) * 4];
+
+ // This might be endian dependent
+ bufThumb[i++] = (uint8)pixelThumb[2];
+ bufThumb[i++] = (uint8)pixelThumb[1];
+ bufThumb[i++] = (uint8)pixelThumb[0];
+ }
+
+ if (!TIFFWriteScanline(tif, bufThumb, y, 0))
+ {
+ kdDebug() << k_funcinfo << "Cannot write thumbnail to target file." << endl;
+ _TIFFfree(bufThumb);
+ TIFFClose(tif);
+ return false;
+ }
+ }
+
+ _TIFFfree(bufThumb);
TIFFClose(tif);
// -------------------------------------------------------------------
More information about the Digikam-devel
mailing list