[VB.net]스크린샷을 찍어보자!

2017. 10. 11. 22:48Programming/VB.net


안녕하세요! Nitro라고 합니다.

오늘은 Vb.net에서 스크린샷을 찍는 법을 알려드릴까 합니다.


[본 강좌는 Visual Studio 2017년 버전을 기준으로 작성되었습니다.]




일단 완성된 프로그램의 모습입니다.


총 16줄짜리의 짧고 심플한 소스코드입니다!


        Try
            Dim screenshots As Bitmap
            Dim graph As Graphics
            screenshots = New Bitmap(SystemInformation.PrimaryMonitorSize.Width, SystemInformation.PrimaryMonitorSize.Height, Imaging.PixelFormat.Format32bppArgb)
            graph = Graphics.FromImage(screenshots)
            graph.CopyFromScreen(0, 0, 0, 0, SystemInformation.PrimaryMonitorSize, CopyPixelOperation.SourceCopy)
            screenshots.Save("C:\Users\" & SystemInformation.UserName & "\Desktop\Screenshot " & Now.ToString("yyyyMMdd-hhmmss") & ".png", Imaging.ImageFormat.Png)
        Catch ex As Exception
            MsgBox("문제가 발생하였습니다. : " & Convert.ToString(ex))
        End Try

위는 핵심 소스코드입니다!

[분석하기]

하나하나 짚어보도록 하죠.

일단 Try .... catch 문입니다.

        Try
            '......(중략)
        Catch ex As Exception
            MsgBox("문제가 발생하였습니다. : " & Convert.ToString(ex))
        End Try


위 소스코드는 (중략 = 즉 사진찍는 코드부분) 에서 발생한 오류를 메시지 박스로 나타나게 해 주는 코드입니다.

여기서 발생한 오류의 내용을 ex 라는 변수로 잡아주는데요.

(Catch ex As Exception '요 부분입니다.)


msgbox 로 ex를 출력해주는데, Convert.ToString 을 사용하지 않는다면

"'String' 및 'Exception' 형식에 대한 and 연산자가 정의되지 않았습니다.'" 라는 오류를 보실 수 있습니다.

말그대로 String 형식을 출력하는 msgbox에서는 Exception 형식을 출력할수 없기때문에 나타나는 오류인데,

Convert.ToString 은 Exception을 String형식으로 변환해 주기에 msgbox로 출력할 수 있습니다.


다음입니다.

본격적인 소스코드입니다.


            Dim screenshots As Bitmap
            Dim graph As Graphics
            screenshots = New Bitmap(SystemInformation.PrimaryMonitorSize.Width, SystemInformation.PrimaryMonitorSize.Height, Imaging.PixelFormat.Format32bppArgb)
            graph = Graphics.FromImage(screenshots)
            graph.CopyFromScreen(0, 0, 0, 0, SystemInformation.PrimaryMonitorSize, CopyPixelOperation.SourceCopy)
            screenshots.Save("C:\Users\" & SystemInformation.UserName & "\Desktop\Screenshot " & Now.ToString("yyyyMMdd-hhmmss") & ".png", Imaging.ImageFormat.Png)

위 코드는 모니터 1(주 모니터)의 전체화면을 png 파일로 저장해줍니다.

여기는 설명해야 할 것이 많습니다.

            Dim screenshots As Bitmap
            Dim graph As Graphics

우선 이 screenshots 을 비트맵 형식으로 선언해주고, graph 를 그래픽 형식으로 선언해줍니다.


            screenshots = New Bitmap(SystemInformation.PrimaryMonitorSize.Width, SystemInformation.PrimaryMonitorSize.Height, Imaging.PixelFormat.Format32bppArgb)


사진을 찍는 과정은 screenshots 이라는 이름을 가진 빈 컨버스에 픽셀을 도트도트로 기입해주는 느낌이라고 생각하시면 되는데요,

위 소스코드는 screenshots 이라는 빈 컨버스를 주 모니터의 크기로 지정해줍니다.

SystemInformation.PrimaryMonitorSize.Width 은 주 모니터의 가로를,

SystemInformation.PrimaryMonitorSize.Height 은 주 모니터의 세로를 지정해줍니다.


만약 전체화면이 아닌 특정 사용자 지정의 크기로 이미지를 찍고싶으시다면,

위 두 값을 사용자 지정값으로 넣어주면 됩니다.


Imaging.PixelFormat.Format32bppArgb은 말 그대로 포멧(이미지의 형식)설정입니다.

다음입니다.
            graph = Graphics.FromImage(screenshots)
            graph.CopyFromScreen(0, 0, 0, 0, SystemInformation.PrimaryMonitorSize, CopyPixelOperation.SourceCopy)
입니다만.

            graph.CopyFromScreen(0, 0, 0, 0, SystemInformation.PrimaryMonitorSize, CopyPixelOperation.SourceCopy)
위 소스코드를 설명해드리겠습니다.

graph.CopyFromScreen(sourceX, sourceY, destinationX, destinationY, blockRegionSize, CopyPixelOperation.SourceCopy)
sourceX
Type: System.Int32

원본 사각형 왼쪽 위 모퉁이에 있는 점의 x-좌표입니다.

sourceY
Type: System.Int32

원본 사각형 왼쪽 위 모퉁이에 있는 점의 y-좌표입니다.

destinationX
Type: System.Int32

대상 사각형 왼쪽 위 모퉁이에 있는 점의 x-좌표입니다.

destinationY
Type: System.Int32

대상 사각형 왼쪽 위 모퉁이에 있는 점의 y-좌표입니다.

blockRegionSize
Type: System.Drawing.Size

전송할 영역의 크기입니다.

라고 설명이 되어있는데요,
간단하게 말하자면 sourceX 는 화면중 캡처를 시작하는 곳의 x 좌표, sourceY 는 화면중 캡처를 시작하는 곳의 y 좌표,
destinationX 와 destinationY는, sourceX , Y를 원점으로 찍을 영역을 말합니다.
음.. 간단하게 설명하자면.


(처음올린 사진에 오류가 있어 보완했습니다. 2017-10-12)

이렇게 되겠습니다!

blockRegionSize 타입같은경우는 가로, 세로 크기가 아닌, 넓이입니다!

SystemInformation.PrimaryMonitorSize는 주 모니터의 넓이를 나타내기에 그냥 입력해도 되지만,

사용자 입력값을 넣고싶을경우,

"new point(가로길이, 세로길이)" 형식으로 입력해 주면 됩니다!


다음입니다!

            screenshots.Save("C:\Users\" & SystemInformation.UserName & "\Desktop\Screenshot " & Now.ToString("yyyyMMdd-hhmmss") & ".png", Imaging.ImageFormat.Png)

인데요, 여기는 쉽습니다!

위 사진 '결과물'을 이미지로 저장해줍니다.


SystemInformation.UserName 는 유저 내임을 반환합니다. (바탕화면 경로를 위해서..)
Now.ToString("yyyyMMdd-hhmmss") 은 날짜와 시간을 반환합니다!
스크린샷을 여러장 찍을경우 이름이 중복되어 그전에 찍혔던 사진을 덮어씌어버릴 경우가 있습니다.
하지만 반복되지 않는 고유번호를 이름으로 써버리면 이름중복으로 덮어질 가능성이 없어지죠!

여기서 yyyyMMdd-hhmmss 의 용도를 알려드리자면,

yyyy는 년도, MM은 월, dd는 일, hh는 시간, mm은 분, ss는 초를 나타넵니다.
MM과 mm은 알파벳이 같기에 소,대문자를 구분해줍시다!

만약 2017년, 10월 11일 10시 20분 24초 에 사진을 찍을경우
Now.ToString("yyyyMMdd-hhmmss") 는 20171011-102024 라는 string 형 값을 반환하게 됩니다.
Now.ToString("yyyyMMdd-hhmmss") 은 어느정도 형식만 맞춰주면 마음대로 변형할 수 있습니다.

Now.ToString("yyyy년 MM월 dd일 hh시 mm분 ss초") 로 사용하면 
2017년 10월 11일 10시 20분 24초 라는 값을 반환하겠죠.

마지막으로 Imaging.ImageFormat.Png 는 이미지 형식을 반환하는데,

System_CAPS_pubpropertySystem_CAPS_staticBmp

BMP (비트맵) 이미지 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticEmf

확장된 메타 파일 (EMF) 이미지 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticExif

교환 가능한 이미지 파일 (Exif) 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticGif

그래픽 교환 GIF 이미지 형식을 가져옵니다.

System_CAPS_pubpropertyGuid

가져옵니다는 Guid 이 나타내는 ImageFormat 개체입니다.

System_CAPS_pubpropertySystem_CAPS_staticIcon

Windows 아이콘 이미지 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticJpeg

Joint Photographic 전문가 JPEG 이미지 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticMemoryBmp

메모리에 비트맵의 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticPng

W3C 이동식 네트워크 그래픽 (PNG) 이미지 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticTiff

파일 형식 TIFF (Tagged Image) 이미지 형식을 가져옵니다.

System_CAPS_pubpropertySystem_CAPS_staticWmf

Windows 메타 파일 (WMF) 이미지 형식을 가져옵니다.


위와 같은 형식을 지원합니다.

이상으로 모든 소스코드 분석이 끝났습니다!

아레 예제를 올려드리니, 연습해보고, 응용해 보시길 바랍니다!


[예제 파일, "Screenshot.zip"]


Screenshot.zip



[참고]


https://msdn.microsoft.com/ko-kr/library/system.drawing.bitmap(v=vs.110).aspx


https://msdn.microsoft.com/ko-kr/library/system.drawing.graphics(v=vs.110).aspx


https://msdn.microsoft.com/ko-kr/library/fw1kt6f9(v=vs.110).aspx


https://msdn.microsoft.com/ko-kr/library/system.drawing.imaging.imageformat(v=vs.110).aspx



[마무리]

이상으로 포스팅이 끝났습니다!

여러분들을 확! 하게 이해시킬만한 능력도 없고, 어휘력도 없지만 앞으로 발전하기를 빌며, 끝내도록 하겠습니다.

부디 이해되셨으면 좋겠네요.


그럼 이상으로 Nitro 였습니다.

다음에 뵙도록 해요!


반응형