Exiv2 커맨드라인 유틸리티를 이용한 JPEG 메타데이타 변경 예제
앞서 작성했던 기능을 코드의 재활용성을 높이기 위해 클래스로 작성한 것이다. 사용 방법은 아래의 main() 함수를 참조하세요.
Exiv2 다운로드 및 커맨드라인(Command Line) 환경에서 사용하는 예
Exiv2를 프로젝트에 설정하고 ShellExecute()함수를 이용하여 소스코드 상에서 호출하는 예
FreeImage 라이브러리를 이용하여 JPEG 이미지의 특정 메타데이타(Metadata)를 읽어오는 예
#include "exivwriter.h"
using namespace std;
/** Exiv2 바이너리 배포판을 다운로드하여 압축을 해제하면 exiv2.exe, libexpat.dll 파일을 확인할 수 있다.
* 이들 2개의 파일은 exiv2프로그램을 참조하여 실행되는 실행파일과 동일한 디렉토리에 복사해 두어야 한다.
* 현재의 이 코드를 컴파일하면 실행파일이 생성되는 곳에 이들 2개의 파일을 복사하면 된다.
*/
int main()
{
BOOL isChanged = ExivWriter::WriteUSerComment("20130522 654321 홍길동", "D:\\test\\sample1.jpg");
if(isChanged) cout << "이미지 파일의 메타데이타 변경 성공" << endl;
else cout << "변경 실패" << endl;
}
ExivWriter.h
#pragma once
#include <iostream>
#include <TCHAR.h>
#include <Windows.h>
#include <atlstr.h>
#pragma comment(lib, "Shell32.lib")
using namespace std;
/** Exiv2 바이너리 배포판을 다운로드하여 압축을 해제하면 exiv2.exe, libexpat.dll 파일을 확인할 수 있다.
* 이들 2개의 파일은 exiv2프로그램을 참조하여 실행되는 실행파일과 동일한 디렉토리에 복사해 두어야 한다.
* 현재의 이 코드를 컴파일하면 실행파일이 생성되는 곳에 이들 2개의 파일을 복사하면 된다.
*/
class ExivWriter
{
public:
ExivWriter(void){};
~ExivWriter(void){};
static BOOL WriteUSerComment(char* value, char* jpgFullPath)
{
cout << "Exiv2 커맨드라인 유틸리티를 ShellExecute()함수로 호출하는 예" << endl;
/**Command Line에서 Exiv2 프로그램을 실행할 때 성공한 명령의 형태
exiv2 -M "set Exif.Photo.UserComment 20130518 321456 허환자" sample.jpg
ShellExecute()함수를 이용하여 위의 명령을 사용하는 경우 명령문의 형태
HINSTANCE hInstance = ShellExecute(NULL, _T("open"), _T("exiv2.exe"),
_T("-M\"set Exif.Photo.UserComment 20130518 321456 허환자\" D:\\test\\sample1.jpg"), NULL, SW_HIDE);
*/
CString cstrCmd("-M\"set Exif.Photo.UserComment ");
cstrCmd += value;
cstrCmd += "\" ";
cstrCmd += jpgFullPath;
/*
HINSTANCE hInstance = ShellExecute(NULL, _T("open"), _T("exiv2.exe"),
_T("-M\"set Exif.Photo.UserComment 20130518 321456 허환자\" D:\\test\\sample1.jpg"), NULL, SW_HIDE);
*/
HINSTANCE hInstance = ShellExecute(NULL, _T("open"), _T("exiv2.exe"),
(LPCTSTR)cstrCmd, NULL, SW_HIDE);
if((int)hInstance > 32)
{
cout << "메타데이타 변경 성공" << endl;
return TRUE;
}
else
{
cout << "Error Code=" << hInstance << endl;
switch((int)hInstance)
{
case 0: cout << "Out of memory(resource)" << endl; break;
case ERROR_FILE_NOT_FOUND: cout << "ERROR_FILE_NOT_FOUND" << endl; break;
case ERROR_PATH_NOT_FOUND: cout << "ERROR_PATH_NOT_FOUND" << endl; break;
case ERROR_BAD_FORMAT: cout << "ERROR_BAD_FORMAT" << endl; break;
case SE_ERR_ACCESSDENIED: cout << "SE_ERR_ACCESSDENIED" << endl; break;
case SE_ERR_DDEBUSY: cout << "SE_ERR_DDEBUSY" << endl; break;
case SE_ERR_DDEFAIL: cout << "SE_ERR_DDEFAIL" << endl; break;
case SE_ERR_DDETIMEOUT: cout << "SE_ERR_DDETIMEOUT" << endl; break;
case SE_ERR_DLLNOTFOUND: cout << "SE_ERR_DLLNOTFOUND" << endl; break;
case SE_ERR_NOASSOC: cout << "SE_ERR_NOASSOC" << endl; break;
case SE_ERR_OOM: cout << "SE_ERR_OOM" << endl; break;
case SE_ERR_SHARE: cout << "SE_ERR_SHARE" << endl; break;
}
}
return FALSE;
}
};