Visual C++/ExivWriter Class Example

JPEG Metadata Writing with Exiv2 Command Line Utility

Soul-Learner 2013. 5. 22. 07:37

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;
}
};