Question about creating device-compatible bitmaps in C#
        Posted  
        
            by MusiGenesis
        on Stack Overflow
        
        See other posts from Stack Overflow
        
            or by MusiGenesis
        
        
        
        Published on 2010-04-05T13:37:01Z
        Indexed on 
            2010/04/05
            14:23 UTC
        
        
        Read the original article
        Hit count: 400
        
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 Bitmapfrom the above code entirely, and go directly from myint[,]array to the device-compatible bitmap (i.e. theIntPtr). I presume this would involve callingCreateCompatibleBitmap, 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.
© Stack Overflow or respective owner