날을 검색 한 후 갑자기 그 대답이 항상 얼굴을 응시하고 있다는 것을 알게되었습니다. 바이트 배열에 대한 포인터에서 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);
비트 블리트 복사 :
여기에 코드입니다. DC에 비트 맵을 그리려면 원본 DC로 비트 맵을 선택한 다음 BitBlt를 사용하여 대상에 비트 맵을 선택합니다. 그게 GDI +'Bitmap' 객체로하고 싶다면'Graphics' 객체가 의도 한 대상 DC를 감싸는'Graphics.DrawImage' 만 사용하면 안 될까요? 왜'HBitmap'을 거쳐야하나요? –
BitBlt가 필요한 이유는 래스터 작업 때문입니다. DrawImage는 한 이미지에서 다른 이미지로 OR 연산을 수행 할 수 없습니다. 그리고 GDI 비트 맵을 사용하여이 작업을 수행했지만 어떻게 hDC로 GDI + 비트 맵을 선택할 수 있습니까? 나는 그것이 가능한지 정말로 알고 싶다. – jnm2