방개
비밀번호를 잊어버리셨나요?

질문

캡쳐 질문이용

    • 글자 크기

 

 

혹시 특정 클라쪽의 특정 부분을 캡쳐하고플땐 어케해야할까요?

Gdip_BitmapFromScreen 이미지 캡쳐쪽을 보고있는데

이건 전체화면같더라고요. 즉, 1번모니터 아니면 2번모니터 전체를 캡쳐하거나

혹 그 모니터의 특정 위치만 캡쳐가능한 함수같아서..

좌표를 넣어봤자  클라이언트 위치가 바뀔때마다 다른 위치가 캡쳐될것같아서 다른 방법이 있을거같은데..혹시 알려주시면 감사합니다. ㅠ

 

그리고 추가적으로 질문드리고싶은거는

이미지 서치 검색하는 범위를 좁히고 싶은데 그러면 gdip_이미지서치 쪽 매개변수에 x,y,x,y쪽에 좌표값을 넣어주면되는걸로 아는데요

스파이를 통해  Relative쪽 부분을 체크해서 해주면 될까요?

범위를 정할 곳의 좌측 상단쪽에 마우스 가져가 대서 x,y 확인해서 적고 우측 하단쪽에 마우스 가져가서 x,y확인해서 적고..

아참 그리고 매개변수로 좌표적을때 좌표 앞에 각각 x또는 y를 붙여야하나요?

혹시 범위를 좁히거나 뭔가 정확도를 높이는 방법에 다른 추가적인 조치도 가능한게있는지 궁금합니다 ㅠ

    • 글자 크기
댓글 9
  • 2020.5.18 10:12 댓글

    1. Gdip_BitmapFromHwnd를 쓰세요.

    2. Relative에 가깝겠지요 (Hwnd로 가져온 특정 창의 비트맵이 Haystack일테니까요.)

    3. 아니요..붙이지 않습니다. 좌표만 써주시면 됩니다.

     

  • 2020.5.18 10:16 댓글

    여담으로, '클라(이언트)'라는 단어는 주로 서버와 통신할 때 사용하는 용어이니 그냥 '특정 창'이라고 하시면 됩니다.

  • 프날님께
    지지서러럭글쓴이
    2020.5.18 14:05 댓글

    제가 잘 이해가 안가서여..

    강의를 보면

    Gdip_BitmapFromScreen("100|100|300|300") <--- 이걸로 찍을 좌표 선택하고

    Gdip_SaveBitmapToFile(pBitmap, sOutput[, Quality]) <-- 찍은걸 이걸로 저장하느걸로 아느데여.

     

    Gdip_BitmapFromHwnd 요것도 특정 창까지만 가져오는거 아닌가싶어서요.

     

    저는 예를 들면 메모장을 찍고싶은게 아닌 메모장의 한쪽 구석탱이를 찍고싶은?

     

    검색하다 하나 찾아봤는데 혹시

    Gdip_CloneBitmapArea(bmpHaystack, 9, 149, 145, 216) 이 함수 아시나여?

     

    저렇게 한다음에 나온 위치를  Gdip_SaveBitmapToFile(pBitmap, sOutput[, Quality]) 요따 넣으면 될거같은데..

    하아..오류는 안나는데 음수가 나오네용 ㅠ

     

     

    bmpHaystack := Gdip_BitmapFromHwnd(WinExist("특정창이름"))
    bmpHaystack2 := Gdip_CloneBitmapArea(bmpHaystack, 27, 152, 200, 550)
    bmpHaystack3 := Gdip_SaveBitmapToFile(bmpHaystack2, "Result.png")

    이러면 result.png라는 이미지가 저장돼야하는데..

    머가 문제일까요.

  • 지지서러럭님께
    2020.5.18 20:23 댓글

    그런식이라면.. 그냥.. BitmapFromHwnd로 가져오신 후 비트맵을 자르시거나 (Gdip_DrawImage를 이용합니다.)

    BitmapFromScreen을 쓰시고 자르시거나

     

    제일 무난한 방법은, 해당 창이 가려져있지 않다는 가정 하에, 그냥 WinGetPos로 그 창 위치 가져와서 자를 만큼 더해주고 BitmapFromScreen의 좌표를 설정해주면 됩니다.

  • 프날님께
    지지서러럭글쓴이
    2020.5.18 22:32 댓글

    두번쨰 방법을 해보았는데여 음 첫번쨰는 요 댓글 달고 해볼예정이구여.

     

    두번째 방법에 대한 결과는 이렇습니다 ㅠ

    bmpHaystack := Gdip_BitmapFromHwnd(WinExist("제목 없음 - 그림판"))

    WinGetPos, posX, posY, Width, Height, ahk_id %bmpHaystack%

    pBitmap := Gdip_BitmapFromScreen("%posX%+12|%posY%+75|120|150")

    Gdip_SaveBitmapToFile(pBitmap, A_Desktop "\새 폴더\Result.png")

     

    말씀하신대로 되려면 WinGetPos로 분명 그림판 위치가 잡혔을거고

    그럼 +해서 그림판내에서 특정 좌표쪽에 스샷이 찍혀야하는데

    모니터 절대좌표 쪽 부분이 찍히네요 ㅠㅠ

     

     

    첫번째 방법도 지금해보았는데..흠;; 잘안되네요..

    Gdip_DrawImage에 대한 매개변수가 엄청 많던데 잘 몰라서 일단 제가 이해한대로 써볼게요 ㅠ

     

    bmpHaystack := Gdip_BitmapFromHwnd(WinExist("제목 없음 - 그림판"))

    pBitmap2 := Gdip_CreateBitmap(100, 100)  -> 얼마만큼 자를지 결정?
    G2 := Gdip_GraphicsFromImage(pBitmap2) -> 위에 부분 g2에 넣어주고..

    Gdip_DrawImage(G2, bmpHaystack, 0, 0, 10, 10, 1, 1, 10, 10) ->

    g2넣어주고 특정 창 핸들넣어주고, 0,0은 모르겠네요 그냥 어느분꺼 따라쓴.. 10,10은 너비 높이던데.. 1,1은 어디부터 자를지 좌표같고..

    그 뒤도 w h로 너비던데.. 왜 두번 넣어주는지는 모르겠네요..ㅠㅠ 이게 제대로 맞게 한건가요..

     

    그냥 거두절미하고

    Gdip_SaveBitmapToFile(bmpHaystack, "Result.png") 이것만 했을땐 해당 창 자체는 잘 찍히거든요.

    그럼 분명 그 중간이 잘못된건데..대체 전체는 잘 찍히면서 그 전체 중 일부를 찍으려고 좀 더 추가하면 안되는지..도저히 모르겠네요.

    줄이 엄청 길어지는것도 아닌데.. ㅠ 지금 질문드린거 제외하고 이전 방법들은 틀린부분도 없어보이는데..

     

     

    계속 질문이 추가되어서 죄송합니다. ㅠ

     더 여쭙고 싶은건

    bmpHaystack := Gdip_BitmapFromHwnd(WinExist("특정창"))

    Gdip_SaveBitmapToFile(bmpHaystack, A_Desktop "\새 폴더\Result.bmp")

    이럼 폴더에 저장이 되잖아요? 그런데 폴더에 저장하지 않고 그걸 바로 카톡으로 보내는 방법을 생각하고있거든요..

    물론 클립보드에 저장해서 보내는 방법도 있는데 그건 다른 작업과 같이 진행시 다른내용이 복사돼서 카톡으로 보내지는 일도 발생하기에..

    ㅠ 아시는 부분이 있으시면 부탁드립니다.

     

    ///////////////////////////////////////////////////////////////////////////////////

    계속 질문드리다가 어찌어찌해서 지금 현 상태는

     

    bmpHaystack := Gdip_BitmapFromHwnd(WinExist("창이름")) ------------------창 넣어주고
    bmpNeedle := Gdip_CreateBitmapFromFile("test.bmp") ----------------------------------비교할 이미지 넣어주고

     

    result := Gdip_ImageSearch(bmpHaystack, bmpNeedle, LIST, 0, 0, 0, 0, 100,"",1,1)   ----------------------------창에서 일치하는 이미지 찾으면

    Gdip_SaveBitmapToFile(bmpHaystack, A_Desktop "\새 폴더\Result.bmp")  --------바탕화면 새폴더에 해당 창을 캡쳐해서 bmp로 저장

    (일단 바로 위 코드는 해당 창이 아니라 해당 창의 일부분을 캡쳐해서 저장하고싶지만 보류 ㅠㅠ)

     Sleep, 1000
     ControlClick, X226 Y218, 새 폴더,, left, 2, NA  ------------------------저장된 이미지폴더에서 상대좌표값으로 저장된 이미지 더블클릭해서 활성화
     Sleep, 1000
     ControlSend,,{CtrlDown}{c}{CtrlUp}, 사진  ----------------활성화된 이미지 컨트롤c로 클립보드로 복사
     Sleep, 3000
     ControlSend,RICHEDIT50W1,{CtrlDown}{v}{CtrlUp}, 카톡방이름    ------------------------이미지 보내고픈 카톡방으로 가서 컨트롤v
     Sleep, 1000
     ControlSend,,{Enter}, 카톡방이름 ------------------------보내고픈 카톡방에 엔터누르기

     

    현재 요렇게인데.. 저장된 이미지폴더에서 상대좌표값으로 저장된 이미지 더블클릭해서 활성화까지만 되고

    클립보드에 저장이 안돼서 카톡방에는 최종적으로 그전에 클립보드에 들어가있는 내용이 보내지네요 ㅠ

    컨트롤c 컨트롤v에서 먼가 잘못된게 있을까요?

     

    사실 폴더에 저장하는것이 아닌 캡쳐 후 바로 클립보드로 보내서 클립보드 내용을 카톡에 보내는 방법이 깔끔하긴한데

    아무리 찾아도 비슷한 내용인데 제가 원하는거랑 조금 다른것같아서 찾기가 어렵네요

     

     

     

     

     

     

     

  • 지지서러럭님께
    2020.5.20 15:51 댓글

    아이고.. 지금 흭인했네요. 제가이일주일간 밖에 나와있다가 이번주 주말에야 집으로 가서 지금은 모바일 환경인데요,

     

    1. 말씀하신 "첫 번째 방법"에서.. 계산하실때.. 문자열 표시를 하는 "" 기호 안에 %기호로 변수를 표시해주셨는데, 그럼 문자열이란 뜻입니까 변수란 뜻입니까? 과연 컴퓨터가 할 수 있을까요? (즉, 그냥 문자열로 생각된다는 뜻입니다.)

    괄호 안에서 변수는 그냥 써주고 문자열은 ""표시를 해줍니다. 근데 변수를 ""안에 써주셨으니 당연히 안되지요.

    여담으로, bmpHaystack 변수엔 해당 비트맵의 메모리 주소가 들어가있지, 그림판의 ahk_id가 들어가있는게 아닙니다. 그런데 "ahk_id" bmpHaystack을 WinGetPos로 잡으면.. 안되겠지요.

     

    이미지를 어딘가에 저장하지 않고 카톡으로 보내는 것이 됩니까?(진짜 몰라서 여쭙는겁니다.) 제가 알기론 안될거예요. 제일 무난한게 클립보드에 저장한 후 보내는건데 이게 안되면... 아무튼 어딘가엔 저장해서 쓰셔야합니다. 파일에서든, 클립보드에서든요.

    Gdip_SetBitmapToClipboard함수(아닐수도있는데, 아무튼 검색하시면 나오고요)는 비트맵을 클립보드에 저장해주는 함수입니다.. 이걸 쓰시면 되겠네요.

  • 2020.5.20 15:52 댓글

    그리고 코드는 '코드 스니펫'을 이용하셔서 올려주시면 깔끔합니다.

    MsgBox, 이렇게 말입니다.

     

  • 2020.5.20 15:53 댓글

    추가) "첫 번째 방법"에 오류가 있다고 말씀드린 구문은

     

    Gdip_BitmapFromScreen("%posX%+12|%posY%+75|120|150")

     

    이 구문을 말씀드린겁니다.

     

    posX라는 변수가 아니라.. %posX%+12라는 "문자열"을 써주신거예요.

  • 지지서러럭글쓴이
    2020.5.21 15:11 댓글

    아아 넵 바쁘시군요. 지금 다른분들의 도움을 받아 잘만들고있습니다. ㅎㅎ

    답변감사드려여.

댓글 달기

서버에 요청 중입니다. 잠시만 기다려 주십시오...