2011-01-03 32 views
5

Có thể sử dụng BitBlt để sao chép trực tiếp từ bitmap GDI + mà không cần sử dụng GetHBitmap không?Có thể BitBlt trực tiếp từ bitmap GDI + không?

GetHBitmap chậm vì nó tạo bản sao mới của toàn bộ hình ảnh, ngoài và chậm hơn bản sao BitBlt và HBITMAP đã cho phải được xử lý. Hình ảnh lớn.

Có cách nào để trỏ BitBlt sử dụng dữ liệu pixel của hình ảnh GDI + gốc không?

EDIT: Tôi có thể lấy con trỏ đến nơi dữ liệu pixel bitmap GDI + nằm trong bộ nhớ. Tôi có thể tạo một HBITMAP trỏ đến dữ liệu pixel bitmap GDI + để tránh bản sao phụ và BitBlt từ đó không?

+1

bitblt bản sao từ một DC khác. Để vẽ bitmap lên DC, bạn chọn bitmap vào nguồn DC và sau đó BitBlt nó vào đích. Nếu đó là những gì bạn muốn làm với một đối tượng GDI + 'Bitmap', bạn không nên sử dụng' Graphics.DrawImage', trong đó đối tượng 'Graphics' bao bọc DC mục tiêu dự định? Tại sao đi qua một 'HBitmap' ở tất cả? –

+1

Lý do tôi cần BitBlt là cho các hoạt động raster của nó. DrawImage không thể thực hiện thao tác OR từ ảnh này sang ảnh khác. Và tôi đã thực hiện nó với bitmap GDI, nhưng làm thế nào tôi có thể chọn một bitmap GDI + vào một hDC? Tôi thực sự muốn biết nếu có thể. – jnm2

Trả lời

6

Sau khi tìm kiếm ngày, nó đột nhiên đánh tôi rằng câu trả lời luôn luôn nhìn chằm chằm vào mặt tôi! Tôi đã tạo một bitmap GDI + từ một con trỏ tới một mảng byte. Sau đó cố gắng tạo một HBITMAP bằng cách sử dụng cùng một con trỏ. Nhưng tôi có thể dễ dàng tạo ra HBITMAP trước và sử dụng con trỏ từ đó để tạo bitmap GDI +.

Nó hoạt động như một sự quyến rũ! Bạn có thể trộn các hoạt động GDI và GDI + theo ý muốn. Hình ảnh vừa đồng thời vừa là GDI và GDI +. Thay vì sử dụng DrawImage, bạn có thể BitBlt từ cùng một dữ liệu pixel giống nhau!

Dưới đây là các mã:

// 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); 
Các vấn đề liên quan