http://bugs.kde.org/show_bug.cgi?id=151552
--- Comment #22 from Gilles Caulier <caulier gilles gmail com> 2009-02-02 18:09:37 --- Andreas, Some pointers for your investigations : When digiKam image editor save image, code which render IPTC preview is given below (cod eis not updated to LXR): ... // Get image Exif/IPTC data. DMetadata meta; meta.setExif(d->image.getExif()); meta.setIptc(d->image.getIptc()); meta.setXmp(d->image.getXmp()); // Update IPTC preview. // NOTE: see B.K.O #130525. a JPEG segment is limited to 64K. If the IPTC byte array is // bigger than 64K during of image preview tag size, the target JPEG image will be // broken. Note that IPTC image preview tag is limited to 256K!!! // There is no limitation with TIFF and PNG about IPTC byte array size. // Before to update IPTC preview, we remove it. meta.removeIptcTag("Iptc.Application2.Preview"); meta.removeIptcTag("Iptc.Application2.PreviewFormat"); meta.removeIptcTag("Iptc.Application2.PreviewVersion"); QSize previewSize = d->image.size(); previewSize.scale(1280, 1024, Qt::KeepAspectRatio); QImage preview; // Ensure that preview is not upscaled if (previewSize.width() >= (int)d->image.width()) preview = d->image.copyQImage(); else preview = d->image.smoothScale(previewSize.width(), previewSize.height(), Qt::IgnoreAspectRatio).copyQImage(); // With JPEG file, we don't store IPTC preview. // NOTE: only store preview if pixel number is at least two times bigger if (/* (2*(previewSize.width() * previewSize.height()) < (int)(d->image.width() * d->image.height())) &&*/ (mimeType.toUpper() != QString("JPG") && mimeType.toUpper() != QString("JPEG") && mimeType.toUpper() != QString("JPE")) ) { // Non JPEG file, we update IPTC preview meta.setImagePreview(preview); } // Update Exif thumbnail. QImage thumb = preview.scaled(160, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation); meta.setExifThumbnail(thumb); // Update Exif Image dimensions. meta.setImageDimensions(d->image.size()); // Update Exif Document Name tag with the original file name. meta.setExifTagString("Exif.Image.DocumentName", getImageFileName()); // Update Exif Orientation tag if necessary. if( setExifOrientationTag ) meta.setImageOrientation(DMetadata::ORIENTATION_NORMAL); // Store new Exif/IPTC/XMP data into image. d->image.setExif(meta.getExif()); d->image.setIptc(meta.getIptc()); d->image.setXmp(meta.getXmp()); ... DMetadata is a devirated class of libkexiv2. It include some digiKam internal methods not shared with the rest of KDE. http://lxr.kde.org/source/extragear/graphics/digikam/libs/dmetadata/dmetadata.h d->image is an instance of DImg container used to store image data + image metadata. http://lxr.kde.org/source/extragear/graphics/digikam/libs/dimg/dimg.h We clear Iptc preview tags, and render preview as reduced image. This one is passed to DMetadata container. Unforget here that we save PNG image. http://lxr.kde.org/source/KDE/kdegraphics/libs/libkexiv2/libkexiv2/kexiv2image.cpp#841 After that, we update IPTC metadata to DImg instance, and we can start to save really the image to PNG file. In this case, DIMG call a dedicated image writter which use libpng : http://lxr.kde.org/source/extragear/graphics/digikam/libs/dimg/loaders/pngloader.cpp#556 In this code, you will see similar code than Exiv2 to make metadata PNG chunks. In fact i must to update this image writter to use libpng to save metadata if Exiv2 < 0.18 else Exiv2 as well. But here this is not the problem i think. Gilles -- Configure bugmail: http://bugs.kde.org/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug. _______________________________________________ Digikam-devel mailing list [hidden email] https://mail.kde.org/mailman/listinfo/digikam-devel |
Free forum by Nabble | Edit this page |