2011-01-03 8 views
5

GetHBitmap을 사용하지 않고 BitBlt를 사용하여 GDI + 비트 맵에서 직접 복사 할 수 있습니까?GDI + 비트 맵에서 BitBlt를 직접 사용할 수 있습니까?

GetHBitmap은 BitBlt 복사본 이외에 전체 이미지의 새 복사본을 만들고 해당 HBITMAP을 삭제해야하므로 속도가 느립니다. 이미지가 큽니다.

BitBlt가 원래 GDI + 이미지의 픽셀 데이터를 사용하도록 지시 할 수있는 방법이 있습니까?

편집 : GDI + 비트 맵 픽셀 데이터가 메모리에있는 위치에 대한 포인터를 얻을 수 있습니다. 여분의 복사본을 피하기 위해 GDI + 비트 맵 픽셀 데이터를 가리키는 HBITMAP을 만들 수 있습니까?

+1

비트 블리트 복사 :

여기에 코드입니다. DC에 비트 맵을 그리려면 원본 DC로 비트 맵을 선택한 다음 BitBlt를 사용하여 대상에 비트 맵을 선택합니다. 그게 GDI +'Bitmap' 객체로하고 싶다면'Graphics' 객체가 의도 한 대상 DC를 감싸는'Graphics.DrawImage' 만 사용하면 안 될까요? 왜'HBitmap'을 거쳐야하나요? –

+1

BitBlt가 필요한 이유는 래스터 작업 때문입니다. DrawImage는 한 이미지에서 다른 이미지로 OR 연산을 수행 할 수 없습니다. 그리고 GDI 비트 맵을 사용하여이 작업을 수행했지만 어떻게 hDC로 GDI + 비트 맵을 선택할 수 있습니까? 나는 그것이 가능한지 정말로 알고 싶다. – jnm2

답변

6

날을 검색 한 후 갑자기 그 대답이 항상 얼굴을 응시하고 있다는 것을 알게되었습니다. 바이트 배열에 대한 포인터에서 GDI + 비트 맵을 작성했습니다. 그런 다음 같은 포인터를 사용하여 HBITMAP을 만들려고합니다. 하지만 나는 HBITMAP을 먼저 쉽게 만들 수 있고 그 포인터를 사용하여 GDI + 비트 맵을 만들 수 있습니다.

그것은 매력처럼 작동합니다! 원하는대로 GDI와 GDI + 작업을 혼합 할 수 있습니다. 이미지는 한 번에 일반 GDI 및 GDI +입니다. DrawImage를 사용하는 대신 정확히 같은 픽셀 데이터에서 BitBlt를 실행할 수 있습니다! 한 DC에서 다른

// Create the HBITMAP 
BITMAPINFO binfo = new BITMAPINFO(); 
binfo.biSize = (uint)Marshal.SizeOf(typeof(BITMAPINFO)); 
binfo.biWidth = width; 
binfo.biHeight = height; 
binfo.biBitCount = (ushort)Image.GetPixelFormatSize(pixelFormat); 
binfo.biPlanes = 1; 
binfo.biCompression = 0; 

hDC = CreateCompatibleDC(IntPtr.Zero); 

IntPtr pointer; 
hBitmap = CreateDIBSection(hDC, ref binfo, 0, out pointer, IntPtr.Zero, 0); 

// Create the GDI+ bitmap using the pointer returned from CreateDIBSection 
gdiBitmap = new Bitmap(width, height, width * binfo.biBitCount >> 3, pixelFormat, pointer);