1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>Exiv2: addmoddel.cpp</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
<link href="tabs.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.6 -->
<div class="tabs">
<ul>
<li><a href="index.html"><span>Main Page</span></a></li>
<li><a href="namespaces.html"><span>Namespaces</span></a></li>
<li><a href="classes.html"><span>Classes</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
<li><a href="examples.html"><span>Examples</span></a></li>
</ul></div>
<h1>addmoddel.cpp</h1>Sample usage of high-level metadata operations.<p>
<div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// ***************************************************************** -*- C++ -*-</span>
<a name="l00002"></a>00002 <span class="comment">// addmoddel.cpp, $Rev: 631 $</span>
<a name="l00003"></a>00003 <span class="comment">// Sample program showing how to add, modify and delete Exif metadata.</span>
<a name="l00004"></a>00004
<a name="l00005"></a>00005 <span class="preprocessor">#include "<a class="code" href="image_8hpp.html">image.hpp</a>"</span>
<a name="l00006"></a>00006 <span class="preprocessor">#include "<a class="code" href="exif_8hpp.html">exif.hpp</a>"</span>
<a name="l00007"></a>00007 <span class="preprocessor">#include <iostream></span>
<a name="l00008"></a>00008 <span class="preprocessor">#include <iomanip></span>
<a name="l00009"></a>00009 <span class="preprocessor">#include <cassert></span>
<a name="l00010"></a>00010
<a name="l00011"></a>00011 <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>* <span class="keyword">const</span> argv[])
<a name="l00012"></a>00012 <span class="keyword">try</span> {
<a name="l00013"></a>00013 <span class="keywordflow">if</span> (argc != 2) {
<a name="l00014"></a>00014 std::cout << <span class="stringliteral">"Usage: "</span> << argv[0] << <span class="stringliteral">" file\n"</span>;
<a name="l00015"></a>00015 <span class="keywordflow">return</span> 1;
<a name="l00016"></a>00016 }
<a name="l00017"></a>00017 std::string file(argv[1]);
<a name="l00018"></a>00018
<a name="l00019"></a>00019 <span class="comment">// Container for exif metadata. This is an example of creating</span>
<a name="l00020"></a>00020 <span class="comment">// exif metadata from scratch. If you want to add, modify, delete</span>
<a name="l00021"></a>00021 <span class="comment">// metadata that exists in an image, start with ImageFactory::open</span>
<a name="l00022"></a>00022 <a name="_a0"></a><a class="code" href="classExiv2_1_1ExifData.html">Exiv2::ExifData</a> exifData;
<a name="l00023"></a>00023
<a name="l00024"></a>00024 <span class="comment">// *************************************************************************</span>
<a name="l00025"></a>00025 <span class="comment">// Add to the Exif data</span>
<a name="l00026"></a>00026
<a name="l00027"></a>00027 <span class="comment">// This is the quickest way to add (simple) Exif data. If a metadatum for</span>
<a name="l00028"></a>00028 <span class="comment">// a given key already exists, its value is overwritten. Otherwise a new</span>
<a name="l00029"></a>00029 <span class="comment">// tag is added.</span>
<a name="l00030"></a>00030 exifData[<span class="stringliteral">"Exif.Image.Model"</span>] = <span class="stringliteral">"Test 1"</span>; <span class="comment">// AsciiValue</span>
<a name="l00031"></a>00031 exifData[<span class="stringliteral">"Exif.Image.SamplesPerPixel"</span>] = uint16_t(162); <span class="comment">// UShortValue</span>
<a name="l00032"></a>00032 exifData[<span class="stringliteral">"Exif.Image.XResolution"</span>] = int32_t(-2); <span class="comment">// LongValue</span>
<a name="l00033"></a>00033 exifData[<span class="stringliteral">"Exif.Image.YResolution"</span>] = <a name="a1"></a><a class="code" href="namespaceExiv2.html#95756f3f7fa19103f83addf5fa088a30">Exiv2::Rational</a>(-2, 3); <span class="comment">// RationalValue</span>
<a name="l00034"></a>00034 std::cout << <span class="stringliteral">"Added a few tags the quick way.\n"</span>;
<a name="l00035"></a>00035
<a name="l00036"></a>00036 <span class="comment">// Create a ASCII string value (note the use of create)</span>
<a name="l00037"></a>00037 <a class="code" href="classExiv2_1_1Value.html#0f62e585b82c97738858b743e60dff21">Exiv2::Value::AutoPtr</a> v = <a name="a2"></a><a class="code" href="classExiv2_1_1Value.html#7a6c027316e3dec0f7e79430f104c137">Exiv2::Value::create</a>(Exiv2::asciiString);
<a name="l00038"></a>00038 <span class="comment">// Set the value to a string</span>
<a name="l00039"></a>00039 v->read(<span class="stringliteral">"1999:12:31 23:59:59"</span>);
<a name="l00040"></a>00040 <span class="comment">// Add the value together with its key to the Exif data container</span>
<a name="l00041"></a>00041 <a name="_a3"></a><a class="code" href="classExiv2_1_1ExifKey.html">Exiv2::ExifKey</a> key(<span class="stringliteral">"Exif.Photo.DateTimeOriginal"</span>);
<a name="l00042"></a>00042 exifData.<a name="a4"></a><a class="code" href="classExiv2_1_1ExifData.html#841b205ae0af419c2639f86d9bf03267">add</a>(key, v.get());
<a name="l00043"></a>00043 std::cout << <span class="stringliteral">"Added key \""</span> << key << <span class="stringliteral">"\", value \""</span> << *v << <span class="stringliteral">"\"\n"</span>;
<a name="l00044"></a>00044
<a name="l00045"></a>00045 <span class="comment">// Now create a more interesting value (without using the create method)</span>
<a name="l00046"></a>00046 <a name="a5"></a><a class="code" href="classExiv2_1_1ValueType.html#0c76c512468a47f6eac463f4af278a14">Exiv2::URationalValue::AutoPtr</a> rv(<span class="keyword">new</span> <a name="_a6"></a><a class="code" href="classExiv2_1_1ValueType.html">Exiv2::URationalValue</a>);
<a name="l00047"></a>00047 <span class="comment">// Set two rational components from a string</span>
<a name="l00048"></a>00048 rv->read(<span class="stringliteral">"1/2 1/3"</span>);
<a name="l00049"></a>00049 <span class="comment">// Add more elements through the extended interface of rational value</span>
<a name="l00050"></a>00050 rv->value_.push_back(std::make_pair(2,3));
<a name="l00051"></a>00051 rv->value_.push_back(std::make_pair(3,4));
<a name="l00052"></a>00052 <span class="comment">// Add the key and value pair to the Exif data</span>
<a name="l00053"></a>00053 key = <a class="code" href="classExiv2_1_1ExifKey.html">Exiv2::ExifKey</a>(<span class="stringliteral">"Exif.Image.PrimaryChromaticities"</span>);
<a name="l00054"></a>00054 exifData.<a class="code" href="classExiv2_1_1ExifData.html#841b205ae0af419c2639f86d9bf03267">add</a>(key, rv.get());
<a name="l00055"></a>00055 std::cout << <span class="stringliteral">"Added key \""</span> << key << <span class="stringliteral">"\", value \""</span> << *rv << <span class="stringliteral">"\"\n"</span>;
<a name="l00056"></a>00056
<a name="l00057"></a>00057 <span class="comment">// *************************************************************************</span>
<a name="l00058"></a>00058 <span class="comment">// Modify Exif data</span>
<a name="l00059"></a>00059
<a name="l00060"></a>00060 <span class="comment">// Since we know that the metadatum exists (or we don't mind creating a new</span>
<a name="l00061"></a>00061 <span class="comment">// tag if it doesn't), we can simply do this:</span>
<a name="l00062"></a>00062 <a name="_a7"></a><a class="code" href="classExiv2_1_1Exifdatum.html">Exiv2::Exifdatum</a>& tag = exifData[<span class="stringliteral">"Exif.Photo.DateTimeOriginal"</span>];
<a name="l00063"></a>00063 std::string date = tag.<a name="a8"></a><a class="code" href="classExiv2_1_1Exifdatum.html#73d1e5346411c2adf520fec405f2e536">toString</a>();
<a name="l00064"></a>00064 date.replace(0, 4, <span class="stringliteral">"2000"</span>);
<a name="l00065"></a>00065 tag.<a name="a9"></a><a class="code" href="classExiv2_1_1Exifdatum.html#2d1b65a584da873113a49d9e88464bee">setValue</a>(date);
<a name="l00066"></a>00066 std::cout << <span class="stringliteral">"Modified key \""</span> << key
<a name="l00067"></a>00067 << <span class="stringliteral">"\", new value \""</span> << tag.<a name="a10"></a><a class="code" href="classExiv2_1_1Exifdatum.html#44d8261179011b2f68075d805e565866">value</a>() << <span class="stringliteral">"\"\n"</span>;
<a name="l00068"></a>00068
<a name="l00069"></a>00069 <span class="comment">// Alternatively, we can use findKey()</span>
<a name="l00070"></a>00070 key = <a class="code" href="classExiv2_1_1ExifKey.html">Exiv2::ExifKey</a>(<span class="stringliteral">"Exif.Image.PrimaryChromaticities"</span>);
<a name="l00071"></a>00071 <a name="a11"></a><a class="code" href="classExiv2_1_1ExifData.html#02e2a2acb4cfeb0f7755c1a45f94106f">Exiv2::ExifData::iterator</a> pos = exifData.<a name="a12"></a><a class="code" href="classExiv2_1_1ExifData.html#9700e579aef8fd1845dd5da59b608773">findKey</a>(key);
<a name="l00072"></a>00072 <span class="keywordflow">if</span> (pos == exifData.<a name="a13"></a><a class="code" href="classExiv2_1_1ExifData.html#9c15177b03489e3d4bb81e9acc1165fe">end</a>()) <span class="keywordflow">throw</span> <a name="_a14"></a><a class="code" href="classExiv2_1_1Error.html">Exiv2::Error</a>(1, <span class="stringliteral">"Key not found"</span>);
<a name="l00073"></a>00073 <span class="comment">// Get a pointer to a copy of the value</span>
<a name="l00074"></a>00074 v = pos->getValue();
<a name="l00075"></a>00075 <span class="comment">// Downcast the Value pointer to its actual type</span>
<a name="l00076"></a>00076 Exiv2::URationalValue* prv = dynamic_cast<Exiv2::URationalValue*>(v.release());
<a name="l00077"></a>00077 <span class="keywordflow">if</span> (prv == 0) <span class="keywordflow">throw</span> Exiv2::Error(1, <span class="stringliteral">"Downcast failed"</span>);
<a name="l00078"></a>00078 rv = <a class="code" href="classExiv2_1_1ValueType.html#0c76c512468a47f6eac463f4af278a14">Exiv2::URationalValue::AutoPtr</a>(prv);
<a name="l00079"></a>00079 <span class="comment">// Modify the value directly through the interface of URationalValue</span>
<a name="l00080"></a>00080 rv->value_[2] = std::make_pair(88,77);
<a name="l00081"></a>00081 <span class="comment">// Copy the modified value back to the metadatum</span>
<a name="l00082"></a>00082 pos->setValue(rv.get());
<a name="l00083"></a>00083 std::cout << <span class="stringliteral">"Modified key \""</span> << key
<a name="l00084"></a>00084 << <span class="stringliteral">"\", new value \""</span> << pos->value() << <span class="stringliteral">"\"\n"</span>;
<a name="l00085"></a>00085
<a name="l00086"></a>00086 <span class="comment">// *************************************************************************</span>
<a name="l00087"></a>00087 <span class="comment">// Delete metadata from the Exif data container</span>
<a name="l00088"></a>00088
<a name="l00089"></a>00089 <span class="comment">// Delete the metadatum at iterator position pos</span>
<a name="l00090"></a>00090 key = <a class="code" href="classExiv2_1_1ExifKey.html">Exiv2::ExifKey</a>(<span class="stringliteral">"Exif.Image.PrimaryChromaticities"</span>);
<a name="l00091"></a>00091 pos = exifData.<a class="code" href="classExiv2_1_1ExifData.html#9700e579aef8fd1845dd5da59b608773">findKey</a>(key);
<a name="l00092"></a>00092 <span class="keywordflow">if</span> (pos == exifData.<a class="code" href="classExiv2_1_1ExifData.html#9c15177b03489e3d4bb81e9acc1165fe">end</a>()) <span class="keywordflow">throw</span> Exiv2::Error(1, <span class="stringliteral">"Key not found"</span>);
<a name="l00093"></a>00093 exifData.<a name="a15"></a><a class="code" href="classExiv2_1_1ExifData.html#13b24f0ee2a3f585cf714b9418b75edd">erase</a>(pos);
<a name="l00094"></a>00094 std::cout << <span class="stringliteral">"Deleted key \""</span> << key << <span class="stringliteral">"\"\n"</span>;
<a name="l00095"></a>00095
<a name="l00096"></a>00096 <span class="comment">// *************************************************************************</span>
<a name="l00097"></a>00097 <span class="comment">// Finally, write the remaining Exif data to the image file</span>
<a name="l00098"></a>00098 <a class="code" href="classExiv2_1_1Image.html#89ad3ffe7a4e8a943d267d77843415fb">Exiv2::Image::AutoPtr</a> image = <a name="a16"></a><a class="code" href="classExiv2_1_1ImageFactory.html#981013bdf0d31ec7f64f0f6339fe323e">Exiv2::ImageFactory::open</a>(file);
<a name="l00099"></a>00099 assert(image.get() != 0);
<a name="l00100"></a>00100
<a name="l00101"></a>00101 image->setExifData(exifData);
<a name="l00102"></a>00102 image->writeMetadata();
<a name="l00103"></a>00103
<a name="l00104"></a>00104 <span class="keywordflow">return</span> 0;
<a name="l00105"></a>00105 }
<a name="l00106"></a>00106 <span class="keywordflow">catch</span> (<a name="_a17"></a><a class="code" href="classExiv2_1_1AnyError.html">Exiv2::AnyError</a>& e) {
<a name="l00107"></a>00107 std::cout << <span class="stringliteral">"Caught Exiv2 exception '"</span> << e << <span class="stringliteral">"'\n"</span>;
<a name="l00108"></a>00108 <span class="keywordflow">return</span> -1;
<a name="l00109"></a>00109 }
</pre></div> <hr size="1"><address style="align: right;"><small>Generated on Fri Jun 2 23:54:09 2006 for Exiv2 by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.6 </small></address>
</body>
</html>
|