func hBitmapFromImage(im image.Image) (win.HBITMAP, error) { var bi win.BITMAPV5HEADER bi.BiSize = uint32(unsafe.Sizeof(bi)) bi.BiWidth = int32(im.Bounds().Dx()) bi.BiHeight = -int32(im.Bounds().Dy()) bi.BiPlanes = 1 bi.BiBitCount = 32 bi.BiCompression = win.BI_BITFIELDS // The following mask specification specifies a supported 32 BPP // alpha format for Windows XP. bi.BV4RedMask = 0x00FF0000 bi.BV4GreenMask = 0x0000FF00 bi.BV4BlueMask = 0x000000FF bi.BV4AlphaMask = 0xFF000000 hdc := win.GetDC(0) defer win.ReleaseDC(0, hdc) var lpBits unsafe.Pointer // Create the DIB section with an alpha channel. hBitmap := win.CreateDIBSection(hdc, &bi.BITMAPINFOHEADER, win.DIB_RGB_COLORS, &lpBits, 0, 0) switch hBitmap { case 0, win.ERROR_INVALID_PARAMETER: return 0, newError("CreateDIBSection failed") } // Fill the image bitmap_array := (*[1 << 30]byte)(unsafe.Pointer(lpBits)) i := 0 for y := im.Bounds().Min.Y; y != im.Bounds().Max.Y; y++ { for x := im.Bounds().Min.X; x != im.Bounds().Max.X; x++ { r, g, b, a := im.At(x, y).RGBA() bitmap_array[i+3] = byte(a >> 8) bitmap_array[i+2] = byte(r >> 8) bitmap_array[i+1] = byte(g >> 8) bitmap_array[i+0] = byte(b >> 8) i += 4 } } return hBitmap, nil }
func NewBitmap(size Size) (bmp *Bitmap, err error) { var hdr win.BITMAPINFOHEADER hdr.BiSize = uint32(unsafe.Sizeof(hdr)) hdr.BiBitCount = 24 hdr.BiCompression = win.BI_RGB hdr.BiPlanes = 1 hdr.BiWidth = int32(size.Width) hdr.BiHeight = int32(size.Height) err = withCompatibleDC(func(hdc win.HDC) error { hBmp := win.CreateDIBSection(hdc, &hdr, win.DIB_RGB_COLORS, nil, 0, 0) switch hBmp { case 0, win.ERROR_INVALID_PARAMETER: return newError("CreateDIBSection failed") } bmp, err = newBitmapFromHBITMAP(hBmp) return err }) return }