프날 오토핫키 강좌
누르면 강좌 리스트가 나와요
프날 오토핫키 강좌

⚠ 이 강좌는 오토핫키 v1을 다룹니다

지금 보시는 강좌는 구버전 오토핫키(v1.1)를 다루고 있습니다. 따라서 본 강좌의 내용은 현재 최신 오토핫키 버전 (v2.0)과 호환되지 않습니다. 구버전의 정보가 필요한 것이 아니라면, 가능한 한 새로운 사이트에 작성한 v2 강좌(https://ahkv2.pnal.dev)를 봐주시길 바랍니다.

[프날 오토핫키] GDI+ (gdip) #4: 이미지 파일의 크기 정보 읽기

본격적으로 GDI+를 써봅시다.

 

GDI+를 이용하면 이미지 파일의 너비와 높이를 가져올 수 있습니다. 물론 다른 방법도 있겠지만, GDI+를 오토핫키에서 쉽게 쓸 수 있도록 만든 gdip 라이브러리를 이용해봅시다.


 비트맵 변환 

GDI+는 '비트맵(Bitmap)'형식의 이미지 파일을 사용합니다.

그렇기 때문에 여러분이 쓰는 이미지를 먼저 비트맵으로 바꿔야합니다. 그리고 그 이미지를 메모리에 적재(Load)시켜서 GDI+에서 자유롭게 이용할 수 있게 해야합니다.

 

말이 어렵죠? 한마디로, 여러분이 가진 이미지 파일을 GDI+가 이용할 수 있도록 불러오는 과정을 해야한다는 뜻입니다.

 

이 과정은 Gdip_CreateBitmapFromFile() 함수로 가능합니다.

매개 변수는 이미지 파일의 경로, 반환 값은 비트맵의 메모리 주소입니다.

이미지 파일을 GDI+가 이용할 수 있도록 변환하고, 그 변환된 이미지(비트맵)가 저장된 메모리 주소를 반환한다는 뜻입니다.

 

아래와 같이 사용할 수 있겠습니다.

#include Gdip_All.ahk
pToken := Gdip_StartUp()

pBitmap := Gdip_CreateBitmapFromFile("1.png")

Gdip_Shutdown(pToken)
Exitapp

포인터 변수라는 의미로 p를 붙여서 pBitmap이라는 변수명을 지어주었습니다.

1.png는 이제 GDI+가 자유롭게 이용할 수 있도록 변환 되어서, pBitmap이 가리키는 주소에 저장되어있을겁니다.

 

MsgBox로 pBitmap을 출력해서, 임의의 정수가 나오면 성공입니다. 저는 8자리 정수가 나오네요.

 

이제 우리는 이미지 파일 대신에 이 pBitmap을 사용하게 될 것입니다.


 비트맵의 크기 정보 읽기 

이제 불러온 비트맵의 크기 정보를 읽으면 끝입니다. 이 역시 gdip에서 함수로 제공하고있습니다.

 

바로 Gdip_GetImageDimensions()함수입니다. 매개변수부터 설명드리겠습니다.

Gdip_GetImageDimensions(pBitmap, Width, Height)
  • pBitmap: 아까 구했던 비트맵의 메모리 주소입니다.
  • Width: 이미지의 너비가 담길 출력 변수입니다.
  • Height: 이미지의 높이가 담길 출력 변수입니다.

즉, Width와 Height 변수는 "출력 변수"입니다. 오토핫키 공식 명령어에서 자주 쓰던 OutputVar와 동일합니다.

 

반환 값은 간단합니다. 해당 함수가 정상적으로 진행 되었으면 0, 이외의 경우엔 음수값을 반환합니다.

 

이제, 전체 소스에 붙여보면 아래와 같이 써질 수 있겠지요.

#include Gdip_All.ahk
pToken := Gdip_StartUp()

pBitmap := Gdip_CreateBitmapFromFile("1.png")
Gdip_GetImageDimensions(pBitmap, outputWidth, outputHeight)

Gdip_Shutdown(pToken)
Exitapp

출력변수명으로 outputWidth, outputHeight를 써주었고, 반환값은 필요없어서 담지 않았습니다.

 

outputWidth와 outputHeight는 따로 출력해보세요. 1.png의 너비와 높이가 출력될 것입니다.


 리소스 정리 (Dispose) 

프로그래밍에서 자원을 관리하는 것은 정말 중요합니다. 그렇기 때문에 뿌린 대로 거두어야, 즉 사용했던 흔적은 말끔하게 지워야 성능 면에서 유리합니다.

GDI+는 이를 위해서 각종 리소스 관리 기능을 제공하고, gdip 라이브러리 또한 이를 함수의 형태로 제공하고 있습니다.

여러가지 리소스를 제거하는 코드가 있는데, 그 중 하나가 "비트맵을 제거하는 함수"입니다.

 

이번 강에서 비트맵을 만들었으니, 지워주어야합니다. Gdip_DisposeImage()함수를 이용해서 말입니다.

Gdip_DisposeImage(pBitmap)

매개변수는 위와 같이 pBitmap을 받게 됩니다. GDI를 사용 종료(Gdip_Shutdown())하기 전에 넣어주어야겠지요.

 

그리고, 여러분이 쓰신 변수는 GDI+의 영역이 아닌 오토핫키 그 자체의 영역이기 때문에, Gdip_Shutdown()후에도 살아있습니다.

즉, 여러분이 Gdip_GetImageDimensions()에서 구한 이미지의 너비와 높이는 Gdip_DisposeImage()와 Gdip_Shutdown()후에도 멀쩡이 잘 살아있으니, 그 뒤에서 너비와 높이 변수를 이용하셔도 문제 없습니다.

 

#include Gdip_All.ahk
pToken := Gdip_StartUp()

pBitmap := Gdip_CreateBitmapFromFile("1.png")
Gdip_GetImageDimensions(pBitmap, outputWidth, outputHeight)
Gdip_DisposeImage(pBitmap)
Gdip_Shutdown(pToken)

MsgBox, % "너비: " outputWidth ", 높이: " outputHeight
Exitapp

Test.ahk
0.00MB

위 예제는 이미지를 Dispose하고, 구한 높이와 너비를 출력하는 것 까지 적혀있는 코드입니다.

 

모든 Gdip함수들이 Gdip_StartUp() (2번째 줄)과 Gdip_Shutdown() (7번째 줄) 사이에 작성된 것을 볼 수 있고,

이번 강에서 배운 함수인 Gdip_CreateBitmapFromFile(), Gdip_GetImageDimensions(), Gdip_DisposeImage() 또한 볼 수 있습니다.

Gdip_GetImageDimensions에서 구한 비트맵의 너비와 높이는 GDI+를 정리한 후 출력한 것도 확인할 수 있습니다. 물론, 출력 후에 정리하셔도 됩니다.


 이번 강에서의 gdip 함수 

Gdip_CreateBitmapFromFile()

매개변수: 이미지 파일의 경로
반환 값: 비트맵의 메모리 주소
Gdip_GetImageDimensions()

매개변수: 크기를 구할 비트맵의 메모리 주소, 너비 출력 변수, 높이 출력 변수
반환 값: 정상 진행시 0, 에러 시 음수값
Gdip_DisposeImage()

매개변수: 제거할 비트맵의 메모리 주소
반환 값: 없음