File: addmoddel_8cpp-example.html

package info (click to toggle)
exiv2 0.10-1.4
  • links: PTS
  • area: main
  • in suites: etch-m68k
  • size: 13,124 kB
  • ctags: 5,665
  • sloc: cpp: 20,697; xml: 15,118; sh: 10,526; ansic: 1,887; makefile: 367; awk: 64; python: 36
file content (130 lines) | stat: -rw-r--r-- 14,352 bytes parent folder | download | duplicates (2)
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&nbsp;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 &lt;iostream&gt;</span>
<a name="l00008"></a>00008 <span class="preprocessor">#include &lt;iomanip&gt;</span>
<a name="l00009"></a>00009 <span class="preprocessor">#include &lt;cassert&gt;</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 &lt;&lt; <span class="stringliteral">"Usage: "</span> &lt;&lt; argv[0] &lt;&lt; <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 &lt;&lt; <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-&gt;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 &lt;&lt; <span class="stringliteral">"Added key \""</span> &lt;&lt; key &lt;&lt; <span class="stringliteral">"\", value \""</span> &lt;&lt; *v &lt;&lt; <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-&gt;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-&gt;value_.push_back(std::make_pair(2,3));
<a name="l00051"></a>00051     rv-&gt;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 &lt;&lt; <span class="stringliteral">"Added key \""</span> &lt;&lt; key &lt;&lt; <span class="stringliteral">"\", value \""</span> &lt;&lt; *rv &lt;&lt; <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>&amp; 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 &lt;&lt; <span class="stringliteral">"Modified key \""</span> &lt;&lt; key
<a name="l00067"></a>00067               &lt;&lt; <span class="stringliteral">"\", new value \""</span> &lt;&lt; tag.<a name="a10"></a><a class="code" href="classExiv2_1_1Exifdatum.html#44d8261179011b2f68075d805e565866">value</a>() &lt;&lt; <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-&gt;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&lt;Exiv2::URationalValue*&gt;(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-&gt;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-&gt;setValue(rv.get());
<a name="l00083"></a>00083     std::cout &lt;&lt; <span class="stringliteral">"Modified key \""</span> &lt;&lt; key
<a name="l00084"></a>00084               &lt;&lt; <span class="stringliteral">"\", new value \""</span> &lt;&lt; pos-&gt;value() &lt;&lt; <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 &lt;&lt; <span class="stringliteral">"Deleted key \""</span> &lt;&lt; key &lt;&lt; <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-&gt;setExifData(exifData);
<a name="l00102"></a>00102     image-&gt;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>&amp; e) {
<a name="l00107"></a>00107     std::cout &lt;&lt; <span class="stringliteral">"Caught Exiv2 exception '"</span> &lt;&lt; e &lt;&lt; <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&nbsp;
<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>