Question about creating device-compatible bitmaps in C#
- by MusiGenesis
I am storing bitmap-like data in a two-dimensional int array. To convert this array into a GDI-compatible bitmap (for use with BitBlt), I am using this function:
public IntPtr GetGDIBitmap(int[,] data)
{
int w = data.GetLength(0);
int h = data.GetLength(1);
IntPtr ret = IntPtr.Zero;
using (Bitmap bmp = new Bitmap(w, h))
{
for (int x = 0; x < w; x++)
{
for (int y = 0; y < h; y++)
{
Color color = Color.FromArgb(data[x, y]);
bmp.SetPixel(x, y, color);
}
}
ret = bmp.GetHbitmap();
}
return ret;
}
This works as expected, but the call to bmp.GetHbitmap() has to allocate memory for the returned bitmap.
I'd like to modify this method in two (probably related) ways:
I'd like to remove the intermediate Bitmap from the above code entirely, and go directly from my int[,] array to the device-compatible bitmap (i.e. the IntPtr). I presume this would involve calling CreateCompatibleBitmap, but I don't know how to go from that call to actually manipulating the pixel values.
This should logically follow from the answer to the first, but I'd also like my method to re-use existing GDI bitmap handles (instead of creating a new bitmap each time).
How can I do this?
NOTE: I don't really use Bitmap.SetPixel(), as its performance could best be described as "glacial". The code is just for illustration.