'비활성 스샷'에 해당되는 글 1건

  1. 2015.09.06 오토핫키+ ImageGet 명령어 추가 (28)

스크린샷 또는 마우스커서 이미지를 얻거나 파일에서 이미지를 로딩하는 명령어를 추가해 봤습니다.

그냥 DllCall 명령어로 만들어 쓸수 있지만 간편하게 써보려고 만들어 봤습니다. 



ImageGet , hBitmapOutVar, [X1, Y1, X2, Y2, InputVar, *option, OutputVarObj]

 

[결과값]

ErrorLevel = 0 : 명령어 정상 실행

ErrorLevel = 1 : 명령어 실행 오류

 

[변수]

hBitmapOutVar : 캡춰되거나 파일에서 로딩한 비트맵데이터의 핸들이 저장되는 변수입니다.

(주의) 사용이 끝난 비트맵핸들의 초기화 필수 - DllCall("DeleteObject", Ptr,hBitmap)

InputVar : 파일에서 로딩하는경우 파일경로나 파일명이 저장된 변수입니다.

      - 변수설정을 하지 않거나 변수에 설정된 값이 없는 경우 CoordMode, Pixel 설정에 따라 윈도우 또는 전체화면 캡쳐를 수행합니다.

OutputVarObj : 해당변수가 존재할시 hBitmapOutVar 출력 이미지의 {width, height} 값을 얻을수 있습니다.

 

[옵션]

*WH : X2, Y2를 가로 세로값(픽셀수)으로 사용합니다.

*CursorOnly : 커서이미지를 가져옵니다.

*ClearBack : 윈도우 캡춰시 뒤쪽 윈도우 잔상현상이 나타날시 사용하는 옵션입니다.

      - CoordMode, Pixel, Relative( or Client) 모드 전용(전체화면 캡춰시엔 필요없는 옵션)

*HBmp : InputVar 변수 값이 HBITMAP 핸들임을 나타내며 명령어 사용후 자동으로 핸들 초기화됩니다.

*HBmpNotDel : InputVar 변수 값이 HBITMAP 핸들임을 나타내며 명령어 사용후에도 핸들이 유지됩니다.

*MemFile : 변수에 저장된 파일구조의 이미지를 비트맵으로 전환할때 사용합니다.

- 현재는 비트맵 파일과 adb에서 받아온 raw이미지 형태의 파일만 가능합니다.

- 로딩된 비트맵 파일구조에서 비트맵을 얻는 오토핫키 스크립트도 있으니 참고하세요.

*HWnd : 지정윈도우 캡쳐시 사용되며 InputVar 변수에 저장된 값을 HWND 핸들로 인식합니다.

*PrintWindow : 지정윈도우 캡쳐시 비활성 캡쳐가 가능하도록 합니다.

- AeroPeek 기능이 활성화된 상태여야 합니다.

- OpenGL 사용 윈도우의 경우 Win10 미만의 버전에서는 캡쳐가 되지 않을 수 있습니다.

*Channel[R|G|B] : 이미지의 RGB 채널을 선택할 수 있습니다. (ex. *ChannelR, *ChannelRB)

 



Test.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 드래그해서 실행하세요.

ImageGet_명령어.zip



사용예)

 

;액트브 윈도우 전체스샷

CoordMode, Pixel, Relative

ImageGet, hBitmap

SaveHBITMAPToFile(hBitmap, "1.액티브윈도우_전체.bmp")

DllCall("DeleteObject", Ptr,hBitmap)

;액티브 윈도우의 클라이언트 전체스샷

CoordMode, Pixel, Client

ImageGet, hBitmap

SaveHBITMAPToFile(hBitmap, "2.액티브윈도우_클라이언트영역.bmp")

DllCall("DeleteObject", Ptr,hBitmap)

;풀스크린샷

CoordMode, Pixel, Screen

ImageGet, hBitmap

SaveHBITMAPToFile(hBitmap, "3.스크린_전체.bmp")

DllCall("DeleteObject", Ptr,hBitmap)

;액티브윈도우의 선택영역 스크린샷

CoordMode, Pixel, Relative

ImageGet, hBitmap, 0,0,80,120

SaveHBITMAPToFile(hBitmap, "4.액티브윈도우_지정영역.bmp")

DllCall("DeleteObject", Ptr,hBitmap)


;마우스가 위치한 특정 윈도우의 클라이언트 영역 스크린샷

MouseGetPos,,, hwnd

CoordMode, Pixel, Client

ImageGet, hBitmap, 0,0,0,0, hwnd, *HWnd *PrintWindow

SaveHBITMAPToFile(hBitmap, "5.지정윈도우_클라이언트영역.bmp")

DllCall("DeleteObject", Ptr,hBitmap)


;커서 이미지 가져오기

ImageGet, hBitmap,,,,,, *CursorOnly

SaveHBITMAPToFile(hBitmap, "6.마우스커서.bmp")

DllCall("DeleteObject", Ptr,hBitmap)

;이미지 파일의 특정영역만 가져오기

imageFile = sample_image.bmp

ImageGet, hBitmap, 200, 150, 50, 30, imageFile, *WH, imageObj

SaveHBITMAPToFile(hBitmap, "7.sample_image_x200y150w50h30영역.bmp")

DllCall("DeleteObject", Ptr,hBitmap)

MsgBox % "파일에서 읽어온 이미지 크기 = " imageObj.width "x" imageObj.height


 


 

 

*ClearBack 옵션 사용 예

 

이런 배치에서 블루스택 윈도우를...

 

 

아래 스크립으로 캡춰할 경우 뒤에 있는 윈도우 영향으로 잔상 또는 크랙 현상이 발생합니다.

(특정 윈도우환경에서만 나타날 수 있는 현상으로 일반적인 현상은 아닙니다.)

F1::

  CoordMode, Pixel, Relative
  ImageGet, hBitmap
  SaveHBITMAPToFile(hBitmap, "1.bmp")
  DllCall("DeleteObject", Ptr,hBitmap)

  ;SaveHBITMAPToFile() 함수는 첨부파일 스크립트에 있으므로 복사해서 테스트 하세요.

return

 

 

이런 경우 *ClearBack 옵션을 써주면 아래처럼 깔끔한 캡춰가 가능합니다.

단 명령어 수행속도가 대폭 느려지므로 깨짐현상이 발생하는 경우에만 사용을 권합니다.

F1::

  CoordMode, Pixel, Relative
  ImageGet, hBitmap,,,,,, *ClearBack
  SaveHBITMAPToFile(hBitmap, "2.bmp")
  DllCall("DeleteObject", Ptr,hBitmap)

  ;SaveHBITMAPToFile() 함수는 첨부파일 스크립트에 있으므로 복사해서 테스트 하세요.

return

 

 

 

Posted by 와이로