2011-01-01 3 views
0

HBITMAP에서 GDI + 비트 맵으로 BitBlt를 보내려고합니다. 나는이 시도했지만 아무 반응이 없습니다 :BitBlt를 직접 GDI + 비트 맵에 연결할 수 있습니까?

Bitmap Buffer = New Bitmap(608, 392) 
Graphics BufferGraphics = Graphics.FromImage(Buffer); 
IntPtr hBufferDC = BufferGraphics.GetHdc(); 

... 

BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY); 

편집 : 나는 그것을 획득하고 훨씬 나중에 비트 블리트와 함께 사용할 경우 분명히있는 hDC이 작동하지 않습니다. hDC가 여전히 유효한지 확인해야했습니다. 해결책은 다음과 같습니다.

Bitmap Buffer = New Bitmap(608, 392) 
Graphics BufferGraphics = Graphics.FromImage(Buffer); 

... 

IntPtr hBufferDC = BufferGraphics.GetHdc(); 
BitBlt(hBufferDC, x, y, width, height, hInputDC, 0, 0, SRCCOPY); 
BufferGraphics.ReleaseHdc(hBufferDC); 

이 변경이 필요한 이유는 누구입니까? 첫 번째 예제에서와 같이 이전에 얻은 hDC를 사용하는 것이 왜 효과가 없을까요?

답변

0

pinvoke.net의 page 끝에있는 샘플을 확인하십시오. CreateCompatibleDC 및 SelectObject를 추가로 호출하면 샘플이 작동 할 수 있습니다.

또는 Graphics.DrawImageUnscalled를 사용하면 .Net 측에서만 코드를 구현할 수 있으며 여전히 우수한 성능을 제공 할 수 있습니다.

(때문에 업데이트 질문에) 업데이트있는 hDC 잠시 후 무효가됩니다 이유를 정확하게
내가 모르겠지만, MSDN에 따라 당신이 쌍과 그룹 사이 GDI + 코드에 대한 호출을 GetHdc 및 ReleaseHdc 전화 : "GetHdc 및 ReleaseHdc 메서드 호출은 쌍으로 나타나야합니다 .GeHdc 및 ReleaseHdc 메서드 쌍의 범위 동안 일반적으로 GDI 함수를 호출합니다."

문서에 따르면 두 번째 예제에서 사용한 방법이 사용 방법이며 GetHdc 메서드의 값을 캐시에 다시 사용하지 않아야합니다.

+0

문제를 발견했을 수도 있지만 아직 해결 중입니다. DrawImageUnscaled는 더 빠르지 않습니다. 실제로 DrawImage를 호출합니다. 당신은 dissasembler와 함께 자신을 위해 볼 수 있습니다. – jnm2

+0

@ jnm2, 맞아, DrawImageUnscalled가 DrawImage를 호출하지만 오버로드보다 훨씬 빠른 이미지 크기 조정을 수행하지 않는 오버로드 버전을 호출합니다. 또한 DrawImageUnscalled가 BitBlt보다 빠르다고 말하지는 않았지만 "상당히 좋은 성능을 제공합니다"라고 말했습니다. –

+0

필요한 정보는 HBITMAP에 있으며 변경할 수는 없으므로 FromHBitmap 또는 BitBlt (더 빠르게)를 사용하여 GDI +로 가져와야합니다. 그런 다음 쌍 선형 스트레칭으로 이미지를 그릴 계획입니다. 하지만 DrawImage에 대해서는 몰랐습니다. 유용 할거야. 알려 줘서 고마워! – jnm2

관련 문제