Added Panasonic makernote, tweaked Olympus makernote just a little bit, updated doc and tests

v0.27.3
Andreas Huggel 20 years ago
parent 0da34a9587
commit 9831922b50

@ -15,7 +15,7 @@
# #
TABLES = Exif Canon CanonCs1 CanonCs2 CanonCf Fujifilm Nikon1 Nikon2 Nikon3 \ TABLES = Exif Canon CanonCs1 CanonCs2 CanonCf Fujifilm Nikon1 Nikon2 Nikon3 \
Olympus Sigma Sony Olympus Panasonic Sigma Sony
TAGLIST = ../../src/taglist TAGLIST = ../../src/taglist

@ -1,3 +1,3 @@
<h1>Exiv2 Tag Tables</h1> <h1>Exiv2 Tag Tables</h1>
<div class="qindex"><a class="qindex" href="tags-exif.html">Exif</a> | <a class="qindex" href="tags-canon.html">Canon</a> | <a class="qindex" href="tags-fujifilm.html">Fujifilm</a> | <a class="qindex" href="tags-nikon.html">Nikon</a> | <a class="qindex" href="tags-olympus.html">Olympus</a> | <a class="qindex" href="tags-sigma.html">Sigma/Foveon</a> | <a class="qindex" href="tags-sony.html">Sony</a> | <a class="qindex" href="tags-iptc.html">Iptc datasets</a></div> <div class="qindex"><a class="qindex" href="tags-exif.html">Exif</a> | <a class="qindex" href="tags-canon.html">Canon</a> | <a class="qindex" href="tags-fujifilm.html">Fujifilm</a> | <a class="qindex" href="tags-nikon.html">Nikon</a> | <a class="qindex" href="tags-olympus.html">Olympus</a> | <a class="qindex" href="tags-panasonic.html">Panasonic</a> | <a class="qindex" href="tags-sigma.html">Sigma/Foveon</a> | <a class="qindex" href="tags-sony.html">Sony</a> | <a class="qindex" href="tags-iptc.html">Iptc datasets</a></div>

@ -138,7 +138,7 @@ Please let me know if you find further specifications on the Internet.</p>
<tr class="OddRow"> <tr class="OddRow">
<td>Panasonic</td> <td>Panasonic</td>
<td>&nbsp;</td> <td>&nbsp;</td>
<td>IFD; Starts with an 12-byte ID string &quot;Panasonic\0\0\0&quot;</td> <td>Non-standard IFD (without a next-IFD pointer); Starts with an 12-byte ID string &quot;Panasonic\0\0\0&quot;</td>
<td><a href="#R8">[8]</a></td> <td><a href="#R8">[8]</a></td>
<td>&nbsp;</td> <td>&nbsp;</td>
</tr> </tr>
@ -183,7 +183,8 @@ t1.onsort = function () {
MakerNote Information</a> by Tom Hughes<br> MakerNote Information</a> by Tom Hughes<br>
<a name="R9">[9]</a> <a href="http://www.ozhiker.com/electronics/pjmt/jpeg_info/makernotes.html"> <a name="R9">[9]</a> <a href="http://www.ozhiker.com/electronics/pjmt/jpeg_info/makernotes.html">
Various Makernote specifications</a> from the <a href="http://www.ozhiker.com/electronics/pjmt/index.html"> Various Makernote specifications</a> from the <a href="http://www.ozhiker.com/electronics/pjmt/index.html">
PHP JPEG Metadata Toolkit</a> by Evan Hunter</p> PHP JPEG Metadata Toolkit</a> by Evan Hunter<br>
<a name="R10">[10]</a> <a href="http://www.sno.phy.queensu.ca/~phil/exiftool/">ExifTool</a>, the most complete and up-to-date tool for reading and writing meta information in image files, by Phil Harvey</p>
</div> </div>
<!-- closes content --> <!-- closes content -->

@ -0,0 +1,19 @@
__doctype__
<html>
__header2__
<body>
<div id="content">
__index1__
__index2__
<h2>Panasonic MakerNote Tags defined in Exiv2</h2>
<div>
<p>Tags found in the MakerNote of images taken with Panasonic cameras.</p>
<p>Click on a column header to sort the table.</p>
</div>
__Panasonic__
</div>
<!-- closes content -->
</body>
</html>

@ -53,8 +53,8 @@ CCHDR = exv_conf.h exv_msvc.h mn.hpp rcsid.hpp
# Add library C++ source files to this list # Add library C++ source files to this list
CCSRC = basicio.cpp canonmn.cpp datasets.cpp error.cpp exif.cpp futils.cpp \ CCSRC = basicio.cpp canonmn.cpp datasets.cpp error.cpp exif.cpp futils.cpp \
fujimn.cpp ifd.cpp image.cpp iptc.cpp jpgimage.cpp makernote.cpp \ fujimn.cpp ifd.cpp image.cpp iptc.cpp jpgimage.cpp makernote.cpp \
metadatum.cpp nikonmn.cpp olympusmn.cpp sigmamn.cpp sonymn.cpp \ metadatum.cpp nikonmn.cpp olympusmn.cpp panasonicmn.cpp sigmamn.cpp \
tags.cpp types.cpp value.cpp sonymn.cpp tags.cpp types.cpp value.cpp
# Add source files of simple applications to this list # Add source files of simple applications to this list
BINSRC = addmoddel.cpp dataarea-test.cpp exifcomment.cpp exifdata-test.cpp \ BINSRC = addmoddel.cpp dataarea-test.cpp exifcomment.cpp exifdata-test.cpp \

@ -13,8 +13,9 @@
@section overview Exiv2 Overview @section overview Exiv2 Overview
%Exiv2 comprises of a C++ library and a command line utility to access image %Exiv2 comprises of a C++ library and a command line utility to access image
metadata. %Exiv2 is free software. metadata. %Exiv2 is free software. The homepage of %Exiv2 is at
<A HREF="http://home.arcor.de/ahuggel/exiv2">http://home.arcor.de/ahuggel/exiv2</A>.
The %Exiv2 library provides The %Exiv2 library provides
- full read and write access to the Exif and Iptc metadata of an image through - full read and write access to the Exif and Iptc metadata of an image through
%Exiv2 keys and standard C++ iterators %Exiv2 keys and standard C++ iterators
@ -47,6 +48,7 @@
- <A HREF="tags-fujifilm.html">Fujifilm MakerNote tags</A> - <A HREF="tags-fujifilm.html">Fujifilm MakerNote tags</A>
- <A HREF="tags-nikon.html">Nikon MakerNote tags</A> - <A HREF="tags-nikon.html">Nikon MakerNote tags</A>
- <A HREF="tags-olympus.html">Olympus MakerNote tags</A> - <A HREF="tags-olympus.html">Olympus MakerNote tags</A>
- <A HREF="tags-panasonic.html">Panasonic MakerNote tags</A>
- <A HREF="tags-sigma.html">Sigma/Foveon MakerNote tags</A> - <A HREF="tags-sigma.html">Sigma/Foveon MakerNote tags</A>
- <A HREF="tags-sony.html">Sony MakerNote tags</A> - <A HREF="tags-sony.html">Sony MakerNote tags</A>
- <A HREF="tags-iptc.html">Iptc datasets</A> - <A HREF="tags-iptc.html">Iptc datasets</A>

@ -36,6 +36,7 @@
#include "fujimn.hpp" #include "fujimn.hpp"
#include "nikonmn.hpp" #include "nikonmn.hpp"
#include "olympusmn.hpp" #include "olympusmn.hpp"
#include "panasonicmn.hpp"
#include "sigmamn.hpp" #include "sigmamn.hpp"
#include "sonymn.hpp" #include "sonymn.hpp"

@ -66,16 +66,16 @@ namespace Exiv2 {
// Olympus Tag Info // Olympus Tag Info
const TagInfo OlympusMakerNote::tagInfo_[] = { const TagInfo OlympusMakerNote::tagInfo_[] = {
TagInfo(0x0200, "SpecialMode", "Picture taking mode", olympusIfdId, makerTags, unsignedLong, print0x0200), TagInfo(0x0200, "SpecialMode", "Picture taking mode", olympusIfdId, makerTags, unsignedLong, print0x0200),
TagInfo(0x0201, "Quality", "Jpeg quality", olympusIfdId, makerTags, unsignedShort, print0x0201), TagInfo(0x0201, "Quality", "Image quality setting", olympusIfdId, makerTags, unsignedShort, print0x0201),
TagInfo(0x0202, "Macro", "Macro mode", olympusIfdId, makerTags, unsignedShort, print0x0202), TagInfo(0x0202, "Macro", "Macro mode", olympusIfdId, makerTags, unsignedShort, print0x0202),
TagInfo(0x0203, "BWMode", "Black and White Mode", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x0203, "BWMode", "Black and White Mode", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0204, "DigitalZoom", "Digital Zoom Ratio", olympusIfdId, makerTags, unsignedRational, print0x0204), TagInfo(0x0204, "DigitalZoom", "Digital zoom ratio", olympusIfdId, makerTags, unsignedRational, print0x0204),
TagInfo(0x0205, "FocalPlaneDiagonal", "Focal Plane Diagonal", olympusIfdId, makerTags, unsignedRational, printValue), TagInfo(0x0205, "FocalPlaneDiagonal", "Focal plane diagonal", olympusIfdId, makerTags, unsignedRational, printValue),
TagInfo(0x0206, "0x0206", "Unknown", olympusIfdId, makerTags, signedShort, printValue), TagInfo(0x0206, "0x0206", "Unknown", olympusIfdId, makerTags, signedShort, printValue),
TagInfo(0x0207, "FirmwareVersion", "Software firmware version", olympusIfdId, makerTags, asciiString, printValue), TagInfo(0x0207, "FirmwareVersion", "Software firmware version", olympusIfdId, makerTags, asciiString, printValue),
TagInfo(0x0208, "PictureInfo", "ASCII format data such as [PictureInfo]", olympusIfdId, makerTags, asciiString, printValue), TagInfo(0x0208, "PictureInfo", "ASCII format data such as [PictureInfo]", olympusIfdId, makerTags, asciiString, printValue),
TagInfo(0x0209, "CameraID", "CameraID data", olympusIfdId, makerTags, undefined, printValue), TagInfo(0x0209, "CameraID", "CameraID data", olympusIfdId, makerTags, undefined, printValue),
TagInfo(0x0300, "PreCaptureFrames", "Pre-capture Frames", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x0300, "PreCaptureFrames", "Pre-capture frames", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0301, "0x0301", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x0301, "0x0301", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0302, "OneTouchWB", "OneTouchWB", olympusIfdId, makerTags, unsignedShort, print0x0302), TagInfo(0x0302, "OneTouchWB", "OneTouchWB", olympusIfdId, makerTags, unsignedShort, print0x0302),
TagInfo(0x0303, "0x0303", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x0303, "0x0303", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
@ -85,29 +85,29 @@ namespace Exiv2 {
TagInfo(0x1001, "0x1001", "Unknown", olympusIfdId, makerTags, signedRational, printValue), TagInfo(0x1001, "0x1001", "Unknown", olympusIfdId, makerTags, signedRational, printValue),
TagInfo(0x1002, "0x1002", "Unknown", olympusIfdId, makerTags, signedRational, printValue), TagInfo(0x1002, "0x1002", "Unknown", olympusIfdId, makerTags, signedRational, printValue),
TagInfo(0x1003, "0x1003", "Unknown", olympusIfdId, makerTags, signedRational, printValue), TagInfo(0x1003, "0x1003", "Unknown", olympusIfdId, makerTags, signedRational, printValue),
TagInfo(0x1004, "FlashMode", "Flash Mode", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1004, "FlashMode", "Flash mode", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1005, "FlashDevice", "Flash Device", olympusIfdId, makerTags, unsignedShort, print0x1005), TagInfo(0x1005, "FlashDevice", "Flash device", olympusIfdId, makerTags, unsignedShort, print0x1005),
TagInfo(0x1006, "Bracket", "Bracket", olympusIfdId, makerTags, signedRational, printValue), TagInfo(0x1006, "Bracket", "Bracket", olympusIfdId, makerTags, signedRational, printValue),
TagInfo(0x1007, "0x1007", "Unknown", olympusIfdId, makerTags, signedShort, printValue), TagInfo(0x1007, "0x1007", "Unknown", olympusIfdId, makerTags, signedShort, printValue),
TagInfo(0x1008, "0x1008", "Unknown", olympusIfdId, makerTags, signedShort, printValue), TagInfo(0x1008, "0x1008", "Unknown", olympusIfdId, makerTags, signedShort, printValue),
TagInfo(0x1009, "0x1009", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1009, "0x1009", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x100a, "0x100a", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x100a, "0x100a", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x100b, "FocusMode", "Focus Mode", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x100b, "FocusMode", "Focus mode", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x100c, "FocusDistance", "Focus Distance", olympusIfdId, makerTags, unsignedRational, printValue), TagInfo(0x100c, "FocusDistance", "Focus distance", olympusIfdId, makerTags, unsignedRational, printValue),
TagInfo(0x100d, "Zoom", "Zoom", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x100d, "Zoom", "Zoom", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x100e, "MacroFocus", "MacroFocus", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x100e, "MacroFocus", "Macro focus", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x100f, "SharpnessFactor", "Sharpness Factor", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x100f, "SharpnessFactor", "Sharpness factor", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1010, "0x1010", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1010, "0x1010", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1011, "ColorMatrix", "Color Matrix", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1011, "ColorMatrix", "Color matrix", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1012, "BlackLevel", "Black Level", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1012, "BlackLevel", "Black level", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1013, "0x1013", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1013, "0x1013", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1014, "0x1014", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1014, "0x1014", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1015, "WhiteBalance", "White Balance", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1015, "WhiteBalance", "White balance", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1016, "0x1016", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1016, "0x1016", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1017, "RedBalance", "Red Balance", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1017, "RedBalance", "Red balance", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1018, "BlueBalance", "Blue Balance", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1018, "BlueBalance", "Blue balance", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1019, "0x1019", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1019, "0x1019", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x101a, "SerialNumber", "Serial Number", olympusIfdId, makerTags, asciiString, printValue), TagInfo(0x101a, "SerialNumber", "Serial number", olympusIfdId, makerTags, asciiString, printValue),
TagInfo(0x101b, "0x101b", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x101b, "0x101b", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x101c, "0x101c", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x101c, "0x101c", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x101d, "0x101d", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x101d, "0x101d", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue),
@ -116,19 +116,19 @@ namespace Exiv2 {
TagInfo(0x1020, "0x1020", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x1020, "0x1020", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x1021, "0x1021", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x1021, "0x1021", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x1022, "0x1022", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x1022, "0x1022", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x1023, "FlashBias", "Flash Bias", olympusIfdId, makerTags, signedRational, printValue), TagInfo(0x1023, "FlashBias", "Flash bias", olympusIfdId, makerTags, signedRational, printValue),
TagInfo(0x1024, "0x1024", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1024, "0x1024", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1025, "0x1025", "Unknown", olympusIfdId, makerTags, signedRational, printValue), TagInfo(0x1025, "0x1025", "Unknown", olympusIfdId, makerTags, signedRational, printValue),
TagInfo(0x1026, "0x1026", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1026, "0x1026", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1027, "0x1027", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1027, "0x1027", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1028, "0x1028", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1028, "0x1028", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1029, "Contrast", "Contrast", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1029, "Contrast", "Contrast setting", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x102a, "SharpnessFactor", "Sharpness Factor", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x102a, "SharpnessFactor", "Sharpness factor", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x102b, "ColorControl", "Color Control", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x102b, "ColorControl", "Color control", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x102c, "ValidBits", "Valid Bits", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x102c, "ValidBits", "Valid bits", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x102d, "Coring Filter", "Coring Filter", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x102d, "Coring Filter", "Coring filter", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x102e, "ImageWidth", "Image Width", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x102e, "ImageWidth", "Image width", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x102f, "ImageHeight", "Image Height", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x102f, "ImageHeight", "Image height", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x1030, "0x1030", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1030, "0x1030", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x1031, "0x1031", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue), TagInfo(0x1031, "0x1031", "Unknown", olympusIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x1032, "0x1032", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue), TagInfo(0x1032, "0x1032", "Unknown", olympusIfdId, makerTags, unsignedShort, printValue),
@ -234,7 +234,7 @@ namespace Exiv2 {
} // OlympusMakerNote::print0x0200 } // OlympusMakerNote::print0x0200
//! Quality //! Quality
const TagDetails Quality[] = { const TagDetails quality[] = {
{ 0, "(start)" }, { 0, "(start)" },
{ 1, "Standard Quality (SQ)" }, { 1, "Standard Quality (SQ)" },
{ 2, "High Quality (HQ)" }, { 2, "High Quality (HQ)" },
@ -246,11 +246,11 @@ namespace Exiv2 {
std::ostream& OlympusMakerNote::print0x0201(std::ostream& os, std::ostream& OlympusMakerNote::print0x0201(std::ostream& os,
const Value& value) const Value& value)
{ {
return TagTranslator(Quality).print(os, value); return TagTranslator(quality).print(os, value);
} // OlympusMakerNote::print0x0201 } // OlympusMakerNote::print0x0201
//! Macro //! Macro
const TagDetails Macro[] = { const TagDetails macro[] = {
{ -1, "(start)" }, { -1, "(start)" },
{ 0, "Off" }, { 0, "Off" },
{ 1, "On" }, { 1, "On" },
@ -261,7 +261,7 @@ namespace Exiv2 {
std::ostream& OlympusMakerNote::print0x0202(std::ostream& os, std::ostream& OlympusMakerNote::print0x0202(std::ostream& os,
const Value& value) const Value& value)
{ {
return TagTranslator(Macro).print(os, value); return TagTranslator(macro).print(os, value);
} // OlympusMakerNote::print0x0202 } // OlympusMakerNote::print0x0202
std::ostream& OlympusMakerNote::print0x0204(std::ostream& os, std::ostream& OlympusMakerNote::print0x0204(std::ostream& os,

@ -0,0 +1,361 @@
// ***************************************************************** -*- C++ -*-
/*
* Copyright (C) 2004, 2005 Andreas Huggel <ahuggel@gmx.net>
*
* This program is part of the Exiv2 distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
File: panasonicmn.cpp
Version: $Rev$
Author(s): Andreas Huggel (ahu) <ahuggel@gmx.net>
History: 11-Jun-04, ahu: created
Credits: See header file
*/
// *****************************************************************************
#include "rcsid.hpp"
EXIV2_RCSID("@(#) $Id$");
// *****************************************************************************
// included header files
#include "types.hpp"
#include "panasonicmn.hpp"
#include "makernote.hpp"
#include "value.hpp"
// + standard includes
#include <string>
#include <sstream>
#include <iomanip>
#include <cassert>
// Define DEBUG_MAKERNOTE to output debug information to std::cerr
#undef DEBUG_MAKERNOTE
// *****************************************************************************
// class member definitions
namespace Exiv2 {
//! @cond IGNORE
PanasonicMakerNote::RegisterMn::RegisterMn()
{
MakerNoteFactory::registerMakerNote("Panasonic", "*", createPanasonicMakerNote);
MakerNoteFactory::registerMakerNote(
panasonicIfdId, MakerNote::AutoPtr(new PanasonicMakerNote));
ExifTags::registerMakerTagInfo(panasonicIfdId, tagInfo_);
}
//! @endcond
// Panasonic MakerNote Tag Info
const TagInfo PanasonicMakerNote::tagInfo_[] = {
TagInfo(0x0001, "Quality", "Image Quality", panasonicIfdId, makerTags, unsignedShort, print0x0001),
TagInfo(0x0002, "FirmwareVersion", "Firmware version", panasonicIfdId, makerTags, undefined, printValue),
TagInfo(0x0003, "WhiteBalance", "White balance setting", panasonicIfdId, makerTags, unsignedShort, print0x0003),
TagInfo(0x0004, "0x0004", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0007, "FocusMode", "Focus mode", panasonicIfdId, makerTags, unsignedShort, print0x0007),
TagInfo(0x000f, "SpotMode", "Spot mode", panasonicIfdId, makerTags, unsignedByte, print0x000f),
TagInfo(0x001a, "ImageStabilizer", "Image stabilizer", panasonicIfdId, makerTags, unsignedShort, print0x001a),
TagInfo(0x001c, "Macro", "Macro mode", panasonicIfdId, makerTags, unsignedShort, print0x001c),
TagInfo(0x001f, "ShootingMode", "Shooting mode", panasonicIfdId, makerTags, unsignedShort, print0x001f),
TagInfo(0x0020, "Audio", "Audio", panasonicIfdId, makerTags, unsignedShort, print0x0020),
TagInfo(0x0021, "DataDump", "Data dump", panasonicIfdId, makerTags, undefined, printValue),
TagInfo(0x0022, "0x0022", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0023, "WhiteBalanceBias", "White balance adjustment", panasonicIfdId, makerTags, unsignedShort, print0x0023),
TagInfo(0x0024, "FlashBias", "Flash bias", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0025, "SerialNumber", "Serial number", panasonicIfdId, makerTags, undefined, printValue),
TagInfo(0x0026, "0x0026", "Unknown", panasonicIfdId, makerTags, undefined, printValue),
TagInfo(0x0027, "0x0027", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0028, "ColorEffect", "Color effect", panasonicIfdId, makerTags, unsignedShort, print0x0028),
TagInfo(0x0029, "0x0029", "Unknown", panasonicIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x002a, "0x002a", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x002b, "0x002b", "Unknown", panasonicIfdId, makerTags, unsignedLong, printValue),
TagInfo(0x002c, "Contrast", "Contrast setting", panasonicIfdId, makerTags, unsignedShort, print0x002c),
TagInfo(0x002d, "NoiseReduction", "Noise reduction", panasonicIfdId, makerTags, unsignedShort, print0x002d),
TagInfo(0x002e, "0x002e", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x002f, "0x002f", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0030, "0x0030", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0031, "0x0031", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x0032, "0x0032", "Unknown", panasonicIfdId, makerTags, unsignedShort, printValue),
TagInfo(0x4449, "0x4449", "Unknown", panasonicIfdId, makerTags, undefined, printValue),
// End of list marker
TagInfo(0xffff, "(UnknownPanasonicMakerNoteTag)", "Unknown PanasonicMakerNote tag", panasonicIfdId, makerTags, invalidTypeId, printValue)
};
PanasonicMakerNote::PanasonicMakerNote(bool alloc)
: IfdMakerNote(panasonicIfdId, alloc, false)
{
byte buf[] = {
'P', 'a', 'n', 'a', 's', 'o', 'n', 'i', 'c', 0x00, 0x00, 0x00
};
readHeader(buf, 12, byteOrder_);
}
PanasonicMakerNote::PanasonicMakerNote(const PanasonicMakerNote& rhs)
: IfdMakerNote(rhs)
{
}
int PanasonicMakerNote::readHeader(const byte* buf,
long len,
ByteOrder byteOrder)
{
if (len < 12) return 1;
header_.alloc(12);
memcpy(header_.pData_, buf, header_.size_);
// Adjust the offset of the IFD for the prefix
adjOffset_ = 12;
return 0;
}
int PanasonicMakerNote::checkHeader() const
{
int rc = 0;
// Check the Panasonic prefix
if ( header_.size_ < 12
|| std::string(reinterpret_cast<char*>(header_.pData_), 9)
!= std::string("Panasonic", 9)) {
rc = 2;
}
return rc;
}
PanasonicMakerNote::AutoPtr PanasonicMakerNote::create(bool alloc) const
{
return AutoPtr(create_(alloc));
}
PanasonicMakerNote* PanasonicMakerNote::create_(bool alloc) const
{
AutoPtr makerNote = AutoPtr(new PanasonicMakerNote(alloc));
assert(makerNote.get() != 0);
makerNote->readHeader(header_.pData_, header_.size_, byteOrder_);
return makerNote.release();
}
PanasonicMakerNote::AutoPtr PanasonicMakerNote::clone() const
{
return AutoPtr(clone_());
}
PanasonicMakerNote* PanasonicMakerNote::clone_() const
{
return new PanasonicMakerNote(*this);
}
//! Quality
const TagDetails quality[] = {
{ 0, "(start)" },
{ 2, "High" },
{ 3, "Standard" },
{ 6, "Very High" },
{ 7, "Raw" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x0001(std::ostream& os,
const Value& value)
{
return TagTranslator(quality).print(os, value);
} // PanasonicMakerNote::print0x0001
//! WhiteBalance
const TagDetails whiteBalance[] = {
{ 0, "(start)" },
{ 1, "Auto" },
{ 2, "Daylight" },
{ 3, "Cloudy" },
{ 4, "Halogen" },
{ 5, "Manual" },
{ 8, "Flash" },
{ 10, "Black and White" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x0003(std::ostream& os,
const Value& value)
{
return TagTranslator(whiteBalance).print(os, value);
} // PanasonicMakerNote::print0x0003
//! FocusMode
const TagDetails focusMode[] = {
{ 0, "(start)" },
{ 1, "Auto" },
{ 2, "Manual" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x0007(std::ostream& os,
const Value& value)
{
return TagTranslator(focusMode).print(os, value);
} // PanasonicMakerNote::print0x0007
std::ostream& PanasonicMakerNote::print0x000f(std::ostream& os,
const Value& value)
{
if (value.count() < 2 || value.typeId() != unsignedByte) {
return os << value;
}
long l0 = value.toLong(0);
if (l0 == 1) os << "On";
else if (l0 == 16) os << "Off";
else os << value;
return os;
} // PanasonicMakerNote::print0x000f
//! ImageStabilizer
const TagDetails imageStabilizer[] = {
{ 0, "(start)" },
{ 2, "On, Mode 1" },
{ 3, "Off" },
{ 4, "On, Mode 2" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x001a(std::ostream& os,
const Value& value)
{
return TagTranslator(imageStabilizer).print(os, value);
} // PanasonicMakerNote::print0x001a
//! Macro
const TagDetails macro[] = {
{ 0, "(start)" },
{ 1, "On" },
{ 2, "Off" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x001c(std::ostream& os,
const Value& value)
{
return TagTranslator(macro).print(os, value);
} // PanasonicMakerNote::print0x001c
//! ShootingMode
const TagDetails shootingMode[] = {
{ 0, "(start)" },
{ 1, "Normal" },
{ 2, "Portrait" },
{ 3, "Scenery" },
{ 4, "Sports" },
{ 5, "Night Portrait" },
{ 6, "Program" },
{ 7, "Aperture Priority" },
{ 8, "Shutter Priority" },
{ 9, "Macro" },
{ 11, "Manual" },
{ 13, "Panning" },
{ 18, "Fireworks" },
{ 19, "Party" },
{ 20, "Snow" },
{ 21, "Night Scenery" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x001f(std::ostream& os,
const Value& value)
{
return TagTranslator(shootingMode).print(os, value);
} // PanasonicMakerNote::print0x001f
//! Audio
const TagDetails Audio[] = {
{ 0, "(start)" },
{ 1, "Yes" },
{ 2, "No" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x0020(std::ostream& os,
const Value& value)
{
return TagTranslator(Audio).print(os, value);
} // PanasonicMakerNote::print0x0020
std::ostream& PanasonicMakerNote::print0x0023(std::ostream& os,
const Value& value)
{
return os << std::fixed << std::setprecision(1)
<< value.toLong() / 3 << " EV";
} // PanasonicMakerNote::print0x0023
//! ColorEffect
const TagDetails colorEffect[] = {
{ 0, "(start)" },
{ 1, "Off" },
{ 2, "Warm" },
{ 3, "Cool" },
{ 4, "Black and White" },
{ 5, "Sepia" },
{ 0, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x0028(std::ostream& os,
const Value& value)
{
return TagTranslator(colorEffect).print(os, value);
} // PanasonicMakerNote::print0x0028
//! Contrast
const TagDetails contrast[] = {
{ -1, "(start)" },
{ 0, "Standard" },
{ 1, "Low" },
{ 2, "High" },
{ 0x100, "Low" },
{ 0x110, "Standard" },
{ 0x120, "High" },
{ -1, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x002c(std::ostream& os,
const Value& value)
{
return TagTranslator(contrast).print(os, value);
} // PanasonicMakerNote::print0x002c
//! NoiseReduction
const TagDetails noiseReduction[] = {
{ -1, "(start)" },
{ 0, "Standard" },
{ 1, "Low" },
{ 2, "High" },
{ -1, "(end)" }
};
std::ostream& PanasonicMakerNote::print0x002d(std::ostream& os,
const Value& value)
{
return TagTranslator(noiseReduction).print(os, value);
} // PanasonicMakerNote::print0x002d
// *****************************************************************************
// free functions
MakerNote::AutoPtr createPanasonicMakerNote(bool alloc,
const byte* buf,
long len,
ByteOrder byteOrder,
long offset)
{
return MakerNote::AutoPtr(new PanasonicMakerNote(alloc));
}
} // namespace Exiv2

@ -0,0 +1,170 @@
// ***************************************************************** -*- C++ -*-
/*
* Copyright (C) 2004, 2005 Andreas Huggel <ahuggel@gmx.net>
*
* This program is part of the Exiv2 distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*!
@file panasonicmn.hpp
@brief Panasonic MakerNote implemented using the following references:
<a href="http://www.compton.nu/panasonic.html">Panasonic MakerNote Information</a> by Tom Hughes,
Panasonic.pm of <a href="http://www.sno.phy.queensu.ca/~phil/exiftool/">ExifTool</a> by Phil Harvey,
<a href="http://www.ozhiker.com/electronics/pjmt/jpeg_info/panasonic_mn.html">Panasonic Makernote Format Specification</a> by Evan Hunter.
@version $Rev$
@author Andreas Huggel (ahu)
<a href="mailto:ahuggel@gmx.net">ahuggel@gmx.net</a>
@date 11-Jun-05, ahu: created
*/
#ifndef PANASONICMN_HPP_
#define PANASONICMN_HPP_
// *****************************************************************************
// included header files
#include "types.hpp"
#include "makernote.hpp"
#include "tags.hpp"
// + standard includes
#include <string>
#include <iosfwd>
#include <memory>
// *****************************************************************************
// namespace extensions
namespace Exiv2 {
// *****************************************************************************
// class declarations
class Value;
// *****************************************************************************
// free functions
/*!
@brief Return an auto-pointer to a newly created empty MakerNote
initialized to operate in the memory management model indicated.
The caller owns this copy and the auto-pointer ensures that it
will be deleted.
@param alloc Memory management model for the new MakerNote. Determines if
memory required to store data should be allocated and deallocated
(true) or not (false). If false, only pointers to the buffer
provided to read() will be kept. See Ifd for more background on
this concept.
@param buf Pointer to the makernote character buffer (not used).
@param len Length of the makernote character buffer (not used).
@param byteOrder Byte order in which the Exif data (and possibly the
makernote) is encoded (not used).
@param offset Offset from the start of the TIFF header of the makernote
buffer (not used).
@return An auto-pointer to a newly created empty MakerNote. The caller
owns this copy and the auto-pointer ensures that it will be
deleted.
*/
MakerNote::AutoPtr createPanasonicMakerNote(bool alloc,
const byte* buf,
long len,
ByteOrder byteOrder,
long offset);
// *****************************************************************************
// class definitions
//! MakerNote for Panasonic cameras
class PanasonicMakerNote : public IfdMakerNote {
public:
//! Shortcut for a %PanasonicMakerNote auto pointer.
typedef std::auto_ptr<PanasonicMakerNote> AutoPtr;
//! @name Creators
//@{
/*!
@brief Constructor. Allows to choose whether or not memory management
is required for the makernote entries.
*/
PanasonicMakerNote(bool alloc =true);
//! Copy constructor
PanasonicMakerNote(const PanasonicMakerNote& rhs);
//! Virtual destructor
virtual ~PanasonicMakerNote() {}
//@}
//! @name Manipulators
//@{
int readHeader(const byte* buf,
long len,
ByteOrder byteOrder);
//@}
//! @name Accessors
//@{
int checkHeader() const;
AutoPtr create(bool alloc =true) const;
AutoPtr clone() const;
//@}
//! @name Print functions for Panasonic %MakerNote tags
//@{
//! Print Quality
static std::ostream& print0x0001(std::ostream& os, const Value& value);
//! Print WhiteBalance
static std::ostream& print0x0003(std::ostream& os, const Value& value);
//! Print FocusMode
static std::ostream& print0x0007(std::ostream& os, const Value& value);
//! Print SpotMode
static std::ostream& print0x000f(std::ostream& os, const Value& value);
//! Print ImageStabilizer
static std::ostream& print0x001a(std::ostream& os, const Value& value);
//! Print Macro
static std::ostream& print0x001c(std::ostream& os, const Value& value);
//! Print ShootingMode
static std::ostream& print0x001f(std::ostream& os, const Value& value);
//! Print Audio
static std::ostream& print0x0020(std::ostream& os, const Value& value);
//! Print WhiteBalanceBias
static std::ostream& print0x0023(std::ostream& os, const Value& value);
//! Print ColorEffect
static std::ostream& print0x0028(std::ostream& os, const Value& value);
//! Print Contrast
static std::ostream& print0x002c(std::ostream& os, const Value& value);
//! Print NoiseReduction
static std::ostream& print0x002d(std::ostream& os, const Value& value);
//@}
//! @cond IGNORE
// Public only so that we can create a static instance
struct RegisterMn {
RegisterMn();
};
//! @endcond
private:
//! Internal virtual create function.
PanasonicMakerNote* create_(bool alloc =true) const;
//! Internal virtual copy constructor.
PanasonicMakerNote* clone_() const;
//! Tag information
static const TagInfo tagInfo_[];
}; // class PanasonicMakerNote
static PanasonicMakerNote::RegisterMn registerPanasonicMakerNote;
} // namespace Exiv2
#endif // #ifndef PANASONICMN_HPP_

@ -73,6 +73,7 @@ namespace Exiv2 {
IfdInfo(nikon2IfdId, "Makernote", "Nikon2"), IfdInfo(nikon2IfdId, "Makernote", "Nikon2"),
IfdInfo(nikon3IfdId, "Makernote", "Nikon3"), IfdInfo(nikon3IfdId, "Makernote", "Nikon3"),
IfdInfo(olympusIfdId, "Makernote", "Olympus"), IfdInfo(olympusIfdId, "Makernote", "Olympus"),
IfdInfo(panasonicIfdId, "Makernote", "Panasonic"),
IfdInfo(sigmaIfdId, "Makernote", "Sigma"), IfdInfo(sigmaIfdId, "Makernote", "Sigma"),
IfdInfo(sonyIfdId, "Makernote", "Sony"), IfdInfo(sonyIfdId, "Makernote", "Sony"),
IfdInfo(lastIfdId, "(Last IFD info)", "(Last IFD item)") IfdInfo(lastIfdId, "(Last IFD info)", "(Last IFD item)")

@ -90,7 +90,7 @@ namespace Exiv2 {
ifd0Id, exifIfdId, gpsIfdId, iopIfdId, ifd1Id, ifd0Id, exifIfdId, gpsIfdId, iopIfdId, ifd1Id,
canonIfdId, canonCs1IfdId, canonCs2IfdId, canonCfIfdId, canonIfdId, canonCs1IfdId, canonCs2IfdId, canonCfIfdId,
fujiIfdId, nikon1IfdId, nikon2IfdId, nikon3IfdId, fujiIfdId, nikon1IfdId, nikon2IfdId, nikon3IfdId,
olympusIfdId, sigmaIfdId, sonyIfdId, olympusIfdId, panasonicIfdId, sigmaIfdId, sonyIfdId,
lastIfdId }; lastIfdId };
// ***************************************************************************** // *****************************************************************************

@ -122,6 +122,30 @@ try {
write(file, edMn6); write(file, edMn6);
print(file); print(file);
std::cout <<"\n----- One Olympus MakerNote tag\n";
Exiv2::ExifData edMn7;
edMn7["Exif.Image.Make"] = "OLYMPUS CORPORATION";
edMn7["Exif.Image.Model"] = "C8080WZ";
edMn7["Exif.Olympus.0x0201"] = uint16_t(1);
write(file, edMn7);
print(file);
std::cout <<"\n----- One Panasonic MakerNote tag\n";
Exiv2::ExifData edMn8;
edMn8["Exif.Image.Make"] = "Panasonic";
edMn8["Exif.Image.Model"] = "DMC-FZ5";
edMn8["Exif.Panasonic.0x0001"] = uint16_t(1);
write(file, edMn8);
print(file);
std::cout <<"\n----- One Sony MakerNote tag\n";
Exiv2::ExifData edMn9;
edMn9["Exif.Image.Make"] = "SONY";
edMn9["Exif.Image.Model"] = "DSC-W7";
edMn9["Exif.Sony.0x2000"] = "0 1 2 3 4 5";
write(file, edMn9);
print(file);
std::cout <<"\n----- One IOP tag\n"; std::cout <<"\n----- One IOP tag\n";
Exiv2::ExifData ed3; Exiv2::ExifData ed3;
ed3["Exif.Iop.InteroperabilityIndex"] = "Test 3"; ed3["Exif.Iop.InteroperabilityIndex"] = "Test 3";

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

File diff suppressed because one or more lines are too long

@ -67,6 +67,24 @@ Exif.Image.Model 0x0110 IFD0 Ascii 10
Exif.Image.ExifTag 0x8769 IFD0 Long 1 78 Exif.Image.ExifTag 0x8769 IFD0 Long 1 78
Exif.Nikon3.Quality 0x0004 Makernote Ascii 28 A boring Nikon3 Quality tag Exif.Nikon3.Quality 0x0004 Makernote Ascii 28 A boring Nikon3 Quality tag
----- One Olympus MakerNote tag
Exif.Image.Make 0x010f IFD0 Ascii 20 OLYMPUS CORPORATION
Exif.Image.Model 0x0110 IFD0 Ascii 8 C8080WZ
Exif.Image.ExifTag 0x8769 IFD0 Long 1 78
Exif.Olympus.Quality 0x0201 Makernote Short 1 1
----- One Panasonic MakerNote tag
Exif.Image.Make 0x010f IFD0 Ascii 10 Panasonic
Exif.Image.Model 0x0110 IFD0 Ascii 8 DMC-FZ5
Exif.Image.ExifTag 0x8769 IFD0 Long 1 68
Exif.Panasonic.Quality 0x0001 Makernote Short 1 1
----- One Sony MakerNote tag
Exif.Image.Make 0x010f IFD0 Ascii 5 SONY
Exif.Image.Model 0x0110 IFD0 Ascii 7 DSC-W7
Exif.Image.ExifTag 0x8769 IFD0 Long 1 62
Exif.Sony.0x2000 0x2000 Makernote Undefined 6 0 1 2 3 4 5
----- One IOP tag ----- One IOP tag
Exif.Image.ExifTag 0x8769 IFD0 Long 1 26 Exif.Image.ExifTag 0x8769 IFD0 Long 1 26
Exif.Photo.InteroperabilityTag 0xa005 Exif Long 1 44 Exif.Photo.InteroperabilityTag 0xa005 Exif Long 1 44

@ -21,7 +21,10 @@ images="exiv2-empty.jpg \
exiv2-canon-eos-300d.jpg \ exiv2-canon-eos-300d.jpg \
exiv2-kodak-dc210.jpg \ exiv2-kodak-dc210.jpg \
exiv2-fujifilm-finepix-s2pro.jpg \ exiv2-fujifilm-finepix-s2pro.jpg \
exiv2-sigma-d10.jpg" exiv2-sigma-d10.jpg \
exiv2-olympus-c8080wz.jpg \
exiv2-panasonic-dmc-fz5.jpg \
exiv2-sony-dsc-w7.jpg"
image2="exiv2-empty.jpg \ image2="exiv2-empty.jpg \
20031214_000043.jpg \ 20031214_000043.jpg \
@ -31,7 +34,10 @@ image2="exiv2-empty.jpg \
20030925_201850.jpg \ 20030925_201850.jpg \
20001026_044550.jpg \ 20001026_044550.jpg \
20030926_111535.jpg \ 20030926_111535.jpg \
20040316_075137.jpg" 20040316_075137.jpg \
20040208_093744.jpg \
20050218_212016.jpg \
20050527_051833.jpg"
image3="exiv2-empty.exv \ image3="exiv2-empty.exv \
20031214_000043.exv \ 20031214_000043.exv \
@ -41,7 +47,10 @@ image3="exiv2-empty.exv \
20030925_201850.exv \ 20030925_201850.exv \
20001026_044550.exv \ 20001026_044550.exv \
20030926_111535.exv \ 20030926_111535.exv \
20040316_075137.exv" 20040316_075137.exv \
20040208_093744.exv \
20050218_212016.exv \
20050527_051833.exv"
for i in $images; do cp -f data/$i tmp/; done for i in $images; do cp -f data/$i tmp/; done
echo "Exiv2 test directory -----------------------------------------------------" echo "Exiv2 test directory -----------------------------------------------------"

Loading…
Cancel
Save