2011-01-03 24 views
5

Czy można używać BitBlt do bezpośredniego kopiowania z mapy bitowej GDI + bez korzystania z GetHBitmap?Czy możliwe jest BitBlt bezpośrednio z mapy bitowej GDI +?

GetHBitmap jest powolny, ponieważ tworzy nową kopię całego obrazu, oprócz i wolniej niż kopia BitBlt, a dany HBITMAP musi zostać usunięty. Obraz jest duży.

Czy istnieje sposób na wskazanie BitBlt do użycia danych pikseli oryginalnego obrazu GDI +?

EDYCJA: Mogę uzyskać wskaźnik do miejsca, gdzie dane GDI + bitmapy pikselowe są w pamięci. Czy mogę utworzyć HBITMAP, który wskazuje dane GDI + bitmapy pikseli, aby uniknąć dodatkowej kopii, a BitBlt z tego?

+1

bitblt kopie DC z jednego do drugiego. Aby narysować bitmapę na DC, wybierasz bitmapę do źródła DC, a następnie BitBlt na miejsce docelowe. Jeśli to właśnie chcesz zrobić z obiektem "Bitmap" GDI +, czy nie powinieneś po prostu użyć 'Graphics.DrawImage', gdzie obiekt' Graphics' opakowuje zamierzony cel DC? Po co w ogóle przejść przez "HBitmap"? –

+1

Powód, dla którego potrzebuję BitBlt jest dla jego operacji rastrowych. DrawImage nie może wykonać operacji OR z jednego obrazu do drugiego. I zrobiłem to z bitmapami GDI, ale jak mogę wybrać bitmapę GDI + do hDC? Naprawdę chciałbym wiedzieć, czy to możliwe. – jnm2

Odpowiedz

6

Po kilku dniach poszukiwań nagle uderzyło mnie, że odpowiedź cały czas mnie wpatrywała w twarz! Stworzyłem mapę bitową GDI + ze wskaźnika do tablicy bajtów. Następnie próbujesz utworzyć HBITMAP przy użyciu tego samego wskaźnika. Ale równie dobrze mógłbym najpierw stworzyć HBITMAP i użyć wskaźnika z tego, by stworzyć mapę bitową GDI +.

Działa jak urok! Możesz dowolnie łączyć operacje GDI i GDI +. Obraz jest jednocześnie zwykłym GDI i GDI +. Zamiast korzystać z DrawImage, możesz BitBlt z dokładnie tych samych danych pikseli!

Oto kod:

// 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); 
Powiązane problemy