bool setFaceTags(KExiv2& meta,const char* xmpTagName,const QMap<QString,QRectF>& faces, bool setProgramName) { Q_UNUSED(setProgramName); meta.setXmpTagString(xmpTagName,QString(),KExiv2::XmpTagType(1),false); QString qxmpTagName(QString::fromLatin1(xmpTagName)); QString nameTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Name"); QString typeTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Type"); QString areaTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Area"); QString areaxTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Area/stArea:x"); QString areayTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Area/stArea:y"); QString areawTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Area/stArea:w"); QString areahTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Area/stArea:h"); QString areanormTagKey = qxmpTagName + QString::fromLatin1("[%1]/mwg-rs:Area/stArea:unit"); QMap<QString,QRectF>::const_iterator it = faces.constBegin(); int i =1; while(it != faces.constEnd()) { qreal x,y,w,h; it.value().getRect(&x,&y,&w,&h); /** Set tag name **/ meta.setXmpTagString(nameTagKey.arg(i).toLatin1().constData(),it.key(), KExiv2::XmpTagType(0),false); /** Set tag type as Face **/ meta.setXmpTagString(typeTagKey.arg(i).toLatin1().constData(),QString::fromLatin1("Face"), KExiv2::XmpTagType(0),false); /** Set tag Area, with xmp type struct **/ meta.setXmpTagString(areaTagKey.arg(i).toLatin1().constData(),QString(), KExiv2::XmpTagType(2),false); /** Set stArea:x inside Area structure **/ meta.setXmpTagString(areaxTagKey.arg(i).toLatin1().constData(),QString::number(x), KExiv2::XmpTagType(0),false); /** Set stArea:y inside Area structure **/ meta.setXmpTagString(areayTagKey.arg(i).toLatin1().constData(),QString::number(y), KExiv2::XmpTagType(0),false); /** Set stArea:w inside Area structure **/ meta.setXmpTagString(areawTagKey.arg(i).toLatin1().constData(),QString::number(w), KExiv2::XmpTagType(0),false); /** Set stArea:h inside Area structure **/ meta.setXmpTagString(areahTagKey.arg(i).toLatin1().constData(),QString::number(h), KExiv2::XmpTagType(0),false); /** Set stArea:unit inside Area structure as normalized **/ meta.setXmpTagString(areanormTagKey.arg(i).toLatin1().constData(),QString::fromLatin1("normalized"), KExiv2::XmpTagType(0),false); ++it; ++i; } return true; }
void SaveImgThread::run() { // Perform saving --------------------------------------------------------------- QImage prev = d->img.scaled(1280, 1024, Qt::KeepAspectRatio, Qt::SmoothTransformation); QImage thumb = d->img.scaled(160, 120, Qt::KeepAspectRatio, Qt::SmoothTransformation); QByteArray prof = KPWriteImage::getICCProfilFromFile(RawDecodingSettings::SRGB); KExiv2 meta; meta.setImageProgramId(QString("Kipi-plugins"), QString(kipiplugins_version)); meta.setImageDimensions(d->img.size()); if (d->format != QString("JPEG")) meta.setImagePreview(prev); meta.setExifThumbnail(thumb); meta.setExifTagString("Exif.Image.DocumentName", QString("Scanned Image")); // not i18n meta.setExifTagString("Exif.Image.Make", d->make); meta.setXmpTagString("Xmp.tiff.Make", d->make); meta.setExifTagString("Exif.Image.Model", d->model); meta.setXmpTagString("Xmp.tiff.Model", d->model); meta.setImageDateTime(QDateTime::currentDateTime()); meta.setImageOrientation(KExiv2::ORIENTATION_NORMAL); meta.setImageColorWorkSpace(KExiv2::WORKSPACE_SRGB); KPWriteImage wImageIface; if (d->frmt != KSaneIface::KSaneWidget::FormatRGB_16_C) { QByteArray data((const char*)d->img.bits(), d->img.numBytes()); wImageIface.setImageData(data, d->img.width(), d->img.height(), false, true, prof, meta); } else { // 16 bits color depth image. wImageIface.setImageData(d->ksaneData, d->width, d->height, true, false, prof, meta); } bool ret = false; QString path; if(d->newUrl.isLocalFile()) path = d->newUrl.toLocalFile(); else path = d->newUrl.path(); if (d->format == QString("JPEG")) { ret = wImageIface.write2JPEG(path); } else if (d->format == QString("PNG")) { ret = wImageIface.write2PNG(path); } else if (d->format == QString("TIFF")) { ret = wImageIface.write2TIFF(path); } else { ret = d->img.save(path, d->format.toAscii().data()); } emit signalComplete(d->newUrl, ret); }