我应该如何使用GetDIBits函数

时间:2020-02-19 01:32:34

标签: go winapi

var bitmap win.BITMAP
win.GetObject(win.HGDIOBJ(hBitmap), unsafe.Sizeof(bitmap), unsafe.Pointer(&bitmap))
var bmpInfo win.BITMAPINFO
bmpInfo.BmiHeader.BiSize = uint32(unsafe.Sizeof(Info.BmiHeader))
....................Width = width
....................Height = height
....................Planes = 1
....................BitCount = 24
....................Compression = win.BI_RGB
var hdc win.HDC
hdc = win.GetDC(0)
win.GetDIBits(hdc, bitmap, 0, uint32(bitmap.BmHeight), bitmapInfo, nil, 0)
pBits := make([]byte, imageSize)
win.GetDIBits(hdc, bitmap, 0, uint32(bitmap.BmHeight), bitmapInfo, (*byte)(unsafe.Pointer(&pBits)), 0)

使用软件包github.com/lxn/win

首先,我们在获取GetDIBits函数之前已经完成了所有工作。

之后,我终于尝试使用GetDIBits函数获取图像数据,但它始终返回0。

我将pBits的数据类型更改为'unsafe.Pointer'或'*字节',并尝试了它,但返回了nil或0。

如何从GetDIBits函数获取图像数据?

1 个答案:

答案 0 :(得分:0)

我对Go语言了解不多,但是当您使用GetDIBits时,参数的位置不正确。

lpvBits

指向缓冲区的指针,以接收位图数据。如果此参数是 NULL,该函数将位图的尺寸和格式传递给 lpbi参数指向的BITMAPINFO结构。

lpbmi

指向BITMAPINFO结构的指针,该结构指定所需的格式 用于DIB数据。

您可以这样修改它:

win.GetDIBits(hdc, bitmap, 0, uint32(bitmap.BmHeight), nil, bitmapInfo, 0)
pBits := make([]byte, imageSize)

win.GetDIBits(hdc, bitmap, 0, uint32(bitmap.BmHeight), (*byte)(unsafe.Pointer(&pBits)), bitmapInfo, 0)

引用:Using GetDIBits to load a bitmap