bool MetaEngine::setImageProgramId(const QString& program, const QString& version) const { try { QString software(program); software.append(QString::fromLatin1("-")); software.append(version); // Set program info into Exif.Image.ProcessingSoftware tag (only available with Exiv2 >= 0.14.0). d->exifMetadata()["Exif.Image.ProcessingSoftware"] = std::string(software.toLatin1().constData()); // See B.K.O #142564: Check if Exif.Image.Software already exist. If yes, do not touch this tag. if (!d->exifMetadata().empty()) { Exiv2::ExifData exifData(d->exifMetadata()); Exiv2::ExifKey key("Exif.Image.Software"); Exiv2::ExifData::iterator it = exifData.findKey(key); if (it == exifData.end()) d->exifMetadata()["Exif.Image.Software"] = std::string(software.toLatin1().constData()); } // set program info into XMP tags. #ifdef _XMP_SUPPORT_ if (!d->xmpMetadata().empty()) { // Only create Xmp.xmp.CreatorTool if it do not exist. Exiv2::XmpData xmpData(d->xmpMetadata()); Exiv2::XmpKey key("Xmp.xmp.CreatorTool"); Exiv2::XmpData::iterator it = xmpData.findKey(key); if (it == xmpData.end()) setXmpTagString("Xmp.xmp.CreatorTool", software, false); } setXmpTagString("Xmp.tiff.Software", software, false); #endif // _XMP_SUPPORT_ // Set program info into IPTC tags. d->iptcMetadata()["Iptc.Application2.Program"] = std::string(program.toLatin1().constData()); d->iptcMetadata()["Iptc.Application2.ProgramVersion"] = std::string(version.toLatin1().constData()); return true; } catch( Exiv2::Error& e ) { d->printExiv2ExceptionError(QString::fromLatin1("Cannot set Program identity into image using Exiv2 "), e); } catch(...) { qCCritical(DIGIKAM_METAENGINE_LOG) << "Default exception from Exiv2"; } return false; }
// ----------------------------------------------------------------------------- // // ----------------------------------------------------------------------------- int writeOutputAsTiff(unsigned char* segData, int width, int height, const std::string &outputFile, const std::string &imageDescription) { std::stringstream ss; ss.setf(std::ios::fixed); ss.fill('0'); ss.width(4); std::string fileName = outputFile; TIFF *image; image = TIFFOpen(fileName.c_str(), "w"); if (image == NULL) { std::cout << "Could not open output tiff for writing" << std::endl; return -1; } int err = 0; int imageDims[2] = {width, height}; // set the basic values err = TIFFSetField(image, TIFFTAG_IMAGEWIDTH, (int) imageDims[0]); err = TIFFSetField(image, TIFFTAG_IMAGELENGTH, (int) imageDims[1]); err = TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, 8); err = TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, 3); err = TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, (int) imageDims[1]); // 1 strip #if USE_LZW_COMPRESSION err = TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_LZW); err = TIFFSetField(image, TIFFTAG_PREDICTOR, PREDICTOR_HORIZONTAL); #else err = TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_NONE); #endif // std::string datetime = tifDateTime(); // err = TIFFSetField(image, TIFFTAG_DATETIME, datetime.c_str()); // String based tags if (fileName.length() > 0) { err = TIFFSetField(image, TIFFTAG_DOCUMENTNAME, fileName.c_str()); } if (imageDescription.length() > 0) { err = TIFFSetField(image, TIFFTAG_IMAGEDESCRIPTION, imageDescription.c_str()); } err = TIFFSetField(image, TIFFTAG_ORIENTATION, ORIENTATION_BOTLEFT); err = TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_RGB); err = TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG); // Insert Resolution Units here if possible std::string software("LibTiff"); err = TIFFSetField(image, TIFFTAG_SOFTWARE, software.c_str()); // err = TIFFSetField(image, TIFFTAG_HOSTCOMPUTER, MXADATAMODEL_SYSTEM); // Write the information to the file tsize_t area = static_cast<tsize_t>(imageDims[0]* imageDims[1] * RGB_NUM_COMP); err = TIFFWriteEncodedStrip(image, 0, segData, area); (void) TIFFClose(image); return err; }