示例#1
0
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;
}
示例#2
0
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
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;

}