2017. 10. 11. 22:48ㆍProgramming/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 은 주 모니터의 세로를 지정해줍니다.
만약 전체화면이 아닌 특정 사용자 지정의 크기로 이미지를 찍고싶으시다면,
위 두 값을 사용자 지정값으로 넣어주면 됩니다.
graph.CopyFromScreen(0, 0, 0, 0, SystemInformation.PrimaryMonitorSize, 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
전송할 영역의 크기입니다.
(처음올린 사진에 오류가 있어 보완했습니다. 2017-10-12)
이렇게 되겠습니다!
blockRegionSize 타입같은경우는 가로, 세로 크기가 아닌, 넓이입니다!
SystemInformation.PrimaryMonitorSize는 주 모니터의 넓이를 나타내기에 그냥 입력해도 되지만,
사용자 입력값을 넣고싶을경우,
"new point(가로길이, 세로길이)" 형식으로 입력해 주면 됩니다!
다음입니다!
screenshots.Save("C:\Users\" & SystemInformation.UserName & "\Desktop\Screenshot " & Now.ToString("yyyyMMdd-hhmmss") & ".png", Imaging.ImageFormat.Png)
인데요, 여기는 쉽습니다!
위 사진 '결과물'을 이미지로 저장해줍니다.
Bmp | ||
Emf | ||
Exif | ||
Gif | ||
Guid | ||
Icon | ||
Jpeg | ||
MemoryBmp | ||
Png | ||
Tiff | ||
Wmf |
[참고]
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 였습니다.
다음에 뵙도록 해요!
'Programming > VB.net' 카테고리의 다른 글
[vb.net]마우스 Form 이동과 곡면 태두리 만들기! (0) | 2018.12.18 |
---|---|
[Python]Object Detection with TensorFlow API. (0) | 2018.06.15 |
[VB.net]네이버 클로바 음성 합성 기술 API 사용법 (Clova Speech Synthesis : CSS) (4) | 2017.11.15 |
[VB.net]메모리 매핑을 이용한 IPC(프로세스 간 통신) 이용하기 (0) | 2017.11.14 |
[VB.net]Emgu CV를 이용한 이미지속 글자찾기! (2) | 2017.10.18 |