You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
137 lines
3.2 KiB
C++
137 lines
3.2 KiB
C++
// exif.cpp : Implementation of Cexif
|
|
|
|
#include "stdafx.h"
|
|
#include "exif.h"
|
|
|
|
// *****************************************************************************
|
|
// included header files
|
|
#include <exiv2/exv_msvc.h>
|
|
#include <exiv2/actions.hpp>
|
|
#include <exiv2/image.hpp>
|
|
#include <exiv2/jpgimage.hpp>
|
|
#include <exiv2/exiv2.hpp>
|
|
#include <exiv2/utils.hpp>
|
|
#include <exiv2/types.hpp>
|
|
#include <exiv2/exif.hpp>
|
|
#include <exiv2/canonmn.hpp>
|
|
#include <exiv2/iptc.hpp>
|
|
#include <exiv2/futils.hpp>
|
|
#ifndef EXV_HAVE_TIMEGM
|
|
# include <exiv2/timegm.h>
|
|
#endif
|
|
|
|
// + standard includes
|
|
#include <string>
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <fstream>
|
|
#include <sstream>
|
|
#include <cstring>
|
|
#include <cstdio>
|
|
#include <ctime>
|
|
#include <cmath>
|
|
#include <cassert>
|
|
#include <sys/types.h> // for stat()
|
|
#include <sys/stat.h> // for stat()
|
|
#ifdef EXV_HAVE_UNISTD_H
|
|
# include <unistd.h> // for stat()
|
|
#endif
|
|
#ifdef _MSC_VER
|
|
# include <sys/utime.h>
|
|
#include ".\exif.h"
|
|
#else
|
|
# include <utime.h>
|
|
#endif
|
|
|
|
|
|
// Cexif
|
|
|
|
|
|
char* ConvertBSTRToLPSTR (BSTR bstrIn)
|
|
{
|
|
LPSTR pszOut = NULL;
|
|
|
|
if (bstrIn != NULL)
|
|
{
|
|
int nInputStrLen = SysStringLen (bstrIn);
|
|
|
|
// Double NULL Termination
|
|
int nOutputStrLen = WideCharToMultiByte(CP_ACP, 0, bstrIn, nInputStrLen, NULL, 0, 0, 0) + 2;
|
|
|
|
pszOut = new char [nOutputStrLen];
|
|
|
|
if (pszOut)
|
|
{
|
|
memset (pszOut, 0x00, sizeof (char)*nOutputStrLen);
|
|
|
|
WideCharToMultiByte (CP_ACP, 0, bstrIn, nInputStrLen, pszOut, nOutputStrLen, 0, 0);
|
|
}
|
|
}
|
|
|
|
return pszOut;
|
|
}
|
|
|
|
STDMETHODIMP Cexif::GetExif(BSTR FileName, BSTR Tag, VARIANT* OutVal)
|
|
{
|
|
if (!Exiv2::fileExists(ConvertBSTRToLPSTR(FileName), true))
|
|
return S_FALSE;
|
|
|
|
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(ConvertBSTRToLPSTR(FileName));
|
|
image->readMetadata();
|
|
|
|
Exiv2::ExifData &exifData = image->exifData();
|
|
if (exifData.empty())
|
|
return S_FALSE;
|
|
|
|
Exiv2::ExifData::iterator md = exifData.findKey(Exiv2::ExifKey(ConvertBSTRToLPSTR(Tag)));
|
|
if (md != exifData.end()) {
|
|
BSTR a = A2BSTR( (md->value().toString()).c_str() );
|
|
OutVal->vt = VT_BSTR;
|
|
OutVal->bstrVal = a;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP Cexif::GetExifInterpreted(BSTR FileName, VARIANT* OutVal)
|
|
{
|
|
if (!Exiv2::fileExists(ConvertBSTRToLPSTR(FileName), true))
|
|
return S_FALSE;
|
|
|
|
std::stringstream ssRetVal;
|
|
|
|
Exiv2::Image::AutoPtr image = Exiv2::ImageFactory::open(ConvertBSTRToLPSTR(FileName));
|
|
image->readMetadata();
|
|
|
|
//exif info
|
|
Exiv2::ExifData &exifData = image->exifData();
|
|
if (!exifData.empty())
|
|
{
|
|
Exiv2::ExifData::const_iterator md;
|
|
for (md = exifData.begin(); md != exifData.end(); ++md)
|
|
{
|
|
ssRetVal << md->key() << ": "
|
|
<< std::dec << *md
|
|
<< std::endl;
|
|
}
|
|
}
|
|
|
|
//iptc
|
|
Exiv2::IptcData &iptcData = image->iptcData();
|
|
if (!iptcData.empty())
|
|
{
|
|
Exiv2::IptcData::const_iterator md;
|
|
for (md = iptcData.begin(); md != iptcData.end(); ++md)
|
|
{
|
|
ssRetVal << md->key() << ": "
|
|
<< std::dec << *md
|
|
<< std::endl;
|
|
}
|
|
}
|
|
|
|
OutVal->vt = VT_BSTR;
|
|
OutVal->bstrVal = A2BSTR(ssRetVal.str().c_str());
|
|
|
|
return S_OK;
|
|
}
|