.NET/Windows API for .NET

StretchBlt - 지정된 영역을 Bitmap복사

클리엘 2019. 8. 6. 16:33
728x90

StretchBlt함수는 지정된 Device Context영역을 Bitmap복사합니다. 이 기능은 BitBlt함수와 같지만 StretchBit함수는 복사된 Bitmap을 늘이거나 축소하고 좌우대칭을 바꾸는등의 추가적인 작업이 가능합니다.

Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDc As Integer, ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal nSrcWidth As Integer, ByVal nSrcHeight As Integer, ByVal dwRop As Integer) As Integer

▶VB.NET 선언

[DllImport("gdi32")]
public static extern int StretchBlt(int hdc, int x, int y, int nWidth, int nHeight, int hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, int dwRop);

▶C# 선언


StretchBlt함수의 첫번째인수는 복사된 영역이 표시될 대상 Device Context를 기술하고 여섯번째 인수는 복사할 영역의 Device Context를 기술합니다.

[Windows API] - GetDC - Window및 Control의 Device Context 구하기
[Windows API] - GetWindowDC - 현재 Windows화면의 Device Context 구하기

두번째와 세번째인수는 복사된 영역이 표시될 시작좌표를 설정하며 네번째 다섯번째 인수는 앞에서 지정한 영역에서부터 복사된 영역을 표시할 크기를 지정합니다.

일곱번째와 여덟번째 인수는 지정된 Device Context로 부터 복사할 시작영역의 좌표를 설정하고 아홉번째와 열번째 인수에서 지정된 영역으로부터 복사할 영역의 크기를 기술합니다.

마지막인수는 복사된 영역이 표시될 형태를 지정하는 것으로 다음 인수중 하나를 설정하거나 필요에 따라 or단위(VB에서는 Or, C#에서는 |)로 중복하여 기술합니다.

 상수  값  설명
 BLACKNESS  42  검은색으로 표시
 DSTINVERT  550009  대상을 반전
 MERGECOPY  C000CA  원본과 대상을 AND조합
 MERGEPAINT  BB0226  원본과 대상을 OR조합
 NOTSRCCOPY  330008  원본을 반전
 NOTSRCERASE  1100A6  원본과 대상을 OR조합/반전
 PATCOPY  F00021  pattern 복사
 PATINVERT  5A0049  대상을 pattern과 XOR조합
 PATPAINT  FB0A09  pattern을 반전과 OR조합
 SRCAND  8800C6  원본을 AND연산
 SRCCOPY  CC0020  복사
 SRCERASE  440328&  반전된 대상을 원본과 AND연산
 SRCINVERT  660046  원본과 대상을 XOR조합
 WHITENESS  HFF0062&  흰색으로 표시


값에서 VB.NET은 &H, C#은 0x로 16진수로 표시합니다.

위 인수를 토대로 PictureBox가 두개인 상황에서 대상 Device Context의 PictureBox1으로 부터 왼쪽 0부터 가로 100까지, 위쪽 0부터 세로 100까지 해당 Image를 복사한 다음 지정된 Device Context의 PictureBox2에 왼쪽 0부터 가로 100까지, 위쪽 0부터 세로 100까지 똑같이 표시하려면 함수는 다음과 같이 호출될 수 있습니다.

Const SRCCOPY As Integer = &HCC0020

Dim idcd, idcs As Integer
idcd = GetDC(PictureBox2.Handle)
idcs = GetDC(PictureBox1.Handle)

StretchBlt(idcd, 0, 0, 100, 100, idcs, 0, 0, 100, 100, SRCCOPY)

▶VB.NET 호출

Const int SRCCOPY = 0xCC0020;

int idcd, idcs;
idcd = GetDC((int)PictureBox2.Handle);
idcs = GetDC((int)PictureBox1.Handle);

StretchBlt(idcd, 0, 0, 100, 100, idcs, 0, 0, 100, 100, SRCCOPY);

▶C# 호출


이때 만일 복사된 Image를 전체적으로 2배 확대하여 표시하려면 네번째와 다섯번째 인수에서 표시할 크기를 다음과 같이 늘려주면 됩니다.

StretchBlt(idcd, 0, 0, 200, 200, idcs, 0, 0, 100, 100, SRCCOPY)

▶VB.NET 호출

StretchBlt(idcd, 0, 0, 200, 200, idcs, 0, 0, 100, 100, SRCCOPY);

▶C# 호출


또한 좌우 혹은 상하대칭을 바꾸어 표시하려면 두번째와 세번째 인수값을 조정하여 표시를 시작할 위치를 바꾸고 네번째와 다섯번째 인수에서 크기를 역으로 지정하면 자연스럽게 대칭이 바뀌어 표시됩니다.

StretchBlt(idcd, 100, 0, -100, 100, idcs, 0, 0, 100, 100, SRCCOPY)

▶VB.NET(좌우바뀜 예제)

StretchBlt(idcd, 0, 100, 100, -100, idcs, 0, 0, 100, 100, SRCCOPY)

▶VB.NET(상하바뀜 예제)

StretchBlt(idcd, 100, 0, -100, 100, idcs, 0, 0, 100, 100, SRCCOPY);

▶C#(좌우바뀜 예제)

StretchBlt(idcd, 0, 100, 100, -100, idcs, 0, 0, 100, 100, SRCCOPY);

▶C#(상하바뀜 예제)

728x90