func hPackedDIBFromHBITMAP(hBmp win.HBITMAP) (win.HGLOBAL, error) { var dib win.DIBSECTION if win.GetObject(win.HGDIOBJ(hBmp), unsafe.Sizeof(dib), unsafe.Pointer(&dib)) == 0 { return 0, newError("GetObject failed") } bmihSize := uintptr(unsafe.Sizeof(dib.DsBmih)) pixelsSize := uintptr( int32(dib.DsBmih.BiBitCount) * dib.DsBmih.BiWidth * dib.DsBmih.BiHeight) totalSize := bmihSize + pixelsSize hPackedDIB := win.GlobalAlloc(win.GHND, totalSize) dest := win.GlobalLock(hPackedDIB) defer win.GlobalUnlock(hPackedDIB) src := unsafe.Pointer(&dib.DsBmih) win.MoveMemory(dest, src, bmihSize) dest = unsafe.Pointer(uintptr(dest) + bmihSize) src = unsafe.Pointer(uintptr(src) + bmihSize) win.MoveMemory(dest, src, pixelsSize) return hPackedDIB, nil }
func newBitmapFromHBITMAP(hBmp win.HBITMAP) (bmp *Bitmap, err error) { var dib win.DIBSECTION if win.GetObject(win.HGDIOBJ(hBmp), unsafe.Sizeof(dib), unsafe.Pointer(&dib)) == 0 { return nil, newError("GetObject failed") } bmih := &dib.DsBmih bmihSize := uintptr(unsafe.Sizeof(*bmih)) pixelsSize := uintptr(int32(bmih.BiBitCount)*bmih.BiWidth*bmih.BiHeight) / 8 totalSize := uintptr(bmihSize + pixelsSize) hPackedDIB := win.GlobalAlloc(win.GHND, totalSize) dest := win.GlobalLock(hPackedDIB) defer win.GlobalUnlock(hPackedDIB) src := unsafe.Pointer(&dib.DsBmih) win.MoveMemory(dest, src, bmihSize) dest = unsafe.Pointer(uintptr(dest) + bmihSize) src = dib.DsBm.BmBits win.MoveMemory(dest, src, pixelsSize) return &Bitmap{ hBmp: hBmp, hPackedDIB: hPackedDIB, size: Size{ int(bmih.BiWidth), int(bmih.BiHeight), }, }, nil }