프날 오토핫키 강좌

[프날 오토핫키] GDI+ (gdip) #5: 화면 캡처

728x90

이렇게 추상적인 제목을 짓고 싶지 않았는데, 쓰고 싶은대로 쓰면 너무 제목이 길어져서 줄이게 되었습니다.

이번 강좌에서 저희가 할 것은

1. 화면상에서 비트맵을 가져오기
2. 비트맵을 파일로 저장하기

입니다. (비트맵은 저번 강에서 배웠던 개념인데... 기억나죠?)


 화면에서 비트맵 가져오기 

먼저, 화면 상에서 특정 영역을 비트맵으로 가져오는 부분을 알아보겠습니다. 먼저, 지금까지 해왔던 것처럼 GDI+ 초기화와 정리 구문을 써보겠습니다.

#include Gdip_All.ahk
pToken := Gdip_StartUp()

;여기에서 gdip 함수를 사용할 것입니다.

Gdip_Shutdown(pToken)
Exitapp

화면에서 비트맵을 가져오는 함수는 Gdip_BitmapFromScreen()입니다.

매개변수와 반환 값 모두 존재합니다.

  • 매개변수: 비트맵을 가져 올 영역입니다. (후에 설명합니다.)
  • 반환 값: 가져온 비트맵의 메모리 주소입니다.

매개변수로 화면 상의 영역을 써준다고 했는데, 말이 애매하죠?

이 '영역' 매개변수는 아래 중 하나를 선택하여 써줄 수 있습니다.

  1. 모든 모니터
  2. 특정 모니터 (1번 모니터, 2번 모니터...)
  3. 특정 영역

모든 모니터를 가져올려면 매개변수를 생략해버리시면 되며

특정 모니터를 가져오려면 모니터의 번호를 적으시면 됩니다. (1번 모니터면 1, 2번 모니터면 2...)

 

특정 영역을 가져올 때 조금 특이합니다. 바( | )를 사용하여서 x,y,w,h를 표시해줍니다.

[예시]
(100, 100)부터 (300, 300)크기만큼을 가져오고 싶다면

Gdip_BitmapFromScreen("100|100|300|300")

문자열이니까 따옴표(")처리를 해주었습니다. 

 

자, 한번 해보겠습니다. 저는 (X, Y)가 (123, 456)인 지점부터, 가로 세로 (234, 567) 픽셀 크기의 비트맵을 가져오고 싶습니다. 그러면 아래와 같이 써주시면 되겠지요.

#include Gdip_All.ahk
pToken := Gdip_StartUp()

pBitmap := Gdip_BitmapFromScreen("123|456|234|567")

Gdip_Shutdown(pToken)
Exitapp

pBitmap은 어디서 나온 아이냐면, 아까 Gdip_BitmapFormScreen()함수는 가져온 비트맵의 메모리 주소를 반환한다고 말씀드렸었습니다.

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


 비트맵을 파일로 저장하기 

이제 가져온 비트맵을 파일로 저장해봅시다. GDI+에는 비트맵을 파일로 저장하는 기능 또한 포함되어있습니다. gdip에선 GDI+의 이 기능을 Gdip_SaveBitmapToFile()함수로 사용할 수 있습니다.

Gdip_SaveBitmapToFile(pBitmap, sOutput[, Quality])
  • pBitmap: 파일로 저장할 비트맵의 주소입니다.
  • sOutput: 저장 경로입니다. 확장자를 반드시 포함해주어야 합니다.
  • Quality: JPG계열로 저장할 경우, 저장 품질을 1~100 중 하나로 설정 가능합니다. (100이 고화질입니다.)

반환값도 있는데, 정상적으로 저장되면 0이고 뭔가 문제가 있으면 음수값입니다.

 

한번 사용해보겠습니다.

#include Gdip_All.ahk
pToken := Gdip_StartUp()

pBitmap := Gdip_BitmapFromScreen("123|456|234|567")
Gdip_SaveBitmapToFile(pBitmap, A_Desktop "\새 폴더\Result.png")

Gdip_Shutdown(pToken)
Exitapp

123, 456부터 234, 567크기의 비트맵을 바탕화면에 있는 새 폴더에 Result.png라는 이름으로 저장해보았습니다.

 

잘 저장되네요.

우리가 지금까지 한 과정인 '화면 상에서 비트맵을 가져와서, 파일로 저장'하는 과정을 흔히 '캡처'라고 합니다.

이제 여러분은 오토핫키로 쓸만한 캡처 프로그램을 만들 수 있습니다. 

 

마지막으로, 저번 강에서 배웠던 리소스 정리까지 해주면 최고겠지요.

#include Gdip_All.ahk
pToken := Gdip_StartUp()

pBitmap := Gdip_BitmapFromScreen("123|456|234|567")
Gdip_SaveBitmapToFile(pBitmap, A_Desktop "\새 폴더\Result.png")
Gdip_DisposeImage(pBitmap)

Gdip_Shutdown(pToken)
Exitapp

Test.ahk
0.00MB


 이번 강에서의 함수 

Gdip_BitmapFromScreen()

매개변수: 영역 (모니터 번호 또는 x|y|w|h)
반환 값: 가져온 비트맵의 메모리 주소
Gdip_SaveBitmapToFile()

매개변수: 저장할 비트맵의 메모리 주소, 경로, JPG 퀄리티(1~100)
반환 값: 정상 저장 시 0, 오류 시 음수 값

 

 

 

 

반응형