본문 바로가기

Visual C++/ExivWriter Class Example

JPEG Metadata Writing with Exiv2 Command Line Utility

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