[C++ / MFC] 이미지 관리 툴 ImageMagick 사용 방법
1. ImageMagick 다운로드 및 설치
ImageMagick
Create, Edit, Compose, or Convert Digital Images
legacy.imagemagick.org
이미지매직 사이트에 들어가보면 운영체제, 정밀도, bit 등을 나눠서 여러가지 버전들을 제공하고 있는데
용도와 환경에 맞게 원하는 설치파일을 다운받습니다.
Q8은 픽셀당 8비트, Q16은 픽셀당 16비트이고
HDRI는 High-dynamic-range의 약자로 밝은 곳과 어두운 곳을 잘 구분하여 나타나게 하는 기술이라고 합니다.
당연한 얘기지만 고화질로 갈수록 리소스가 더 많이 필요하게 됩니다.
저는 Windows Q8 64비트 static 버전으로 설치해보겠습니다.
I accept the agreement를 선택하고 계속 Next를 클릭해서 설치를 마무리합니다.
lib, dll을 사용해서 직접 소스에서 라이브러리를 로드하여 사용할 수도 있겠지만
제한되는 부분도 많고 제공되는 exe를 사용하는게 더 간편하다고 판단되어
exe파일 사용법에 대해 설명드리겠습니다.
2. ImageMagick exe파일 사용법
경로를 변경하지 않고 설치했다면 위 경로에 설치될 것이고 다양한 exe파일이 존재할 것입니다.
이름으로 대충 유추되긴 하지만 이 exe파일들은 각각 다른 기능들을 가지고 있습니다.
각각의 기능들을 간략하게 표로 정리해보겠습니다.
exe파일 | 설명 |
compare.exe | 두 이미지를 수학적, 시각적으로 비교하는 기능을 제공합니다. |
composite.exe | 두 이미지를 결합하는 기능을 제공합니다. |
conjure.exe | Magick 스크립팅 언어(MSL)로 작성된 스크립트에서 이미지 처리 작업을 수행할 수 있는 기능을 제공합니다. |
convert.exe | 이미지 크기 조정, 자르기, 포맷변경 등 다양한 변환 기능을 제공합니다. |
identify.exe | 이미지가 불완전하거나 손상되었는지 확인하거나 이미지의 정보를 확인하는 기능을 제공합니다. |
mogrify.exe | convert.exe와 거의 똑같은 기능을 제공하지만 따로 포맷 변환을 하지 않는 이상 원본에 덮어씌워진다는 차이가 있습니다. |
montage.exe | 이미지를 결합한다는 점에서는 composite.exe와 유사하지만 결합하여 이미지의 프레임이나 테두리를 꾸미는 기능에 특화되어 있습니다. |
stream.exe | 이미지의 픽셀이나 특정 부분을 문자열과 같이 원하는 형식으로 스트리밍하는 기능을 제공합니다. |
3. ImageMagick 예제
ImageMagick 홈 디렉토리를 환경변수로 등록해놓고 명령프롬프트(CMD)에서 작업해도 되겠지만
대부분 소스상에서 처리되는걸 원하실테니 ShellExecute로 ImageMagick의 exe파일을
실행하는 예제를 몇가지 보여드리겠습니다.
※ 이미지 크기 리사이즈, 포맷 변환
CString sExeFilePath = _T("C:\\Program Files\\ImageMagick-6.9.12-Q8\\convert.exe");
CString sInFileFile = _T("C:\\Temp\\test\\in.jpg");
CString sOutFileFile = _T("C:\\Temp\\test\\out.png");
CString sCommand;
sCommand.Format(_T("%s -resize 50%% %s"), sInFileFile, sOutFileFile);
ShellExecute(NULL, _T("open"), sExeFilePath, sCommand, NULL, SW_HIDE);
/* 이미지 작업이 끝날 때까지 기다려야 할 경우 ShellExecuteEx 활용
SHELLEXECUTEINFO se;
::ZeroMemory(&se, sizeof(SHELLEXECUTEINFO));
se.cbSize = sizeof(SHELLEXECUTEINFO);
se.lpFile = sExeFilePath;
se.lpParameters = sCommand;
se.nShow = SW_HIDE;
se.fMask = SEE_MASK_NOCLOSEPROCESS;
se.lpVerb = _T("open");
DWORD result = ::ShellExecuteEx(&se);
if (se.hProcess != NULL)
WaitForSingleObject(se.hProcess, INFINITE);
*/
※ 이미지 90도 회전
CString sExeFilePath = _T("C:\\Program Files\\ImageMagick-6.9.12-Q8\\convert.exe");
CString sInFileFile = _T("C:\\Temp\\test\\in.jpg");
CString sOutFileFile = _T("C:\\Temp\\test\\out.jpg");
CString sCommand;
sCommand.Format(_T("%s -rotate 90 %s"), sInFileFile, sOutFileFile);
ShellExecute(NULL, _T("open"), sExeFilePath, sCommand, NULL, SW_HIDE);
※ 이미지 붙이기, 배경색 설정
CString sExeFilePath = _T("C:\\Program Files\\ImageMagick-6.9.12-Q8\\montage.exe");
CString sInFileFile = _T("C:\\Temp\\test\\composite1.jpg");
CString sInFileFile2 = _T("C:\\Temp\\test\\composite2.jpg");
CString sOutFileFile = _T("C:\\Temp\\test\\composite.jpg");
CString sCommand;
sCommand.Format(_T("-background #0d9579 %s %s %s"), sInFileFile, sInFileFile2, sOutFileFile);
ShellExecute(NULL, _T("open"), sExeFilePath, sCommand, NULL, SW_HIDE);
※ 이미지 투명도 50% 설정
CString sExeFilePath = _T("C:\\Program Files\\ImageMagick-6.9.12-Q8\\convert.exe");
CString sInFileFile = _T("C:\\Temp\\test\\in.png");
CString sOutFileFile = _T("C:\\Temp\\test\\out.png");
CString sCommand;
sCommand.Format(_T("%s -alpha set -background none -channel A -evaluate multiply 0.5 +channel %s"), sInFileFile, sOutFileFile);
ShellExecute(NULL, _T("open"), sExeFilePath, sCommand, NULL, SW_HIDE);
예제는 이정도만 보여드리고 ImageMagick\www 경로에 가면
다양한 명령어에 대한 사용법을 확인할 수 있는 문서들이 있으니 참고해주시고
검색만 해봐도 정보들이 많이 나오니 어렵지 않게 작업 가능할겁니다.
아래는 각각의 명령어를 적용했을 때 어떤 효과가 나타나는지 나와있는 사진입니다.