【问题标题】:How should I use the GetDIBits function我应该如何使用 GetDIBits 函数
【发布时间】:2020-06-03 02:47:35
【问题描述】:
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' 或 '* byte' 并尝试过,但它返回 nil 或 0。

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

【问题讨论】:

  • 猜测您正在使用github.com/lxn/win(请指定用于避免猜测的包)。在这种情况下,请尝试将 &pBits[0] 传递给函数(有关更多信息,请参阅 this question)。
  • @Brits 包在文中指定。我按照你告诉我的方式试了一下,所以值为0。
  • 感谢您更新问题;不幸的是,如果没有进一步的信息,任何进一步的建议都是猜测。你能添加minimal reproducible example吗?
  • 我同意英国人的观点,你可以先提供一个我们测试的例子。如果你有兴趣,这里有一个类似的C++case供你参考。
  • @Brits 更新内容!!

标签: go winapi


【解决方案1】:

我对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

【讨论】:

  • 我对这个答案有点困惑。函数的签名是func GetDIBits(hdc HDC, hbmp HBITMAP, uStartScan uint32, cScanLines uint32, lpvBits *byte, lpbi *BITMAPINFO, uUsage uint32) int32,所以uUsage(在winapi调用中变成usage)是一个整数(可以为0但不能为空),microsoft docs表示DIB_RGB_COLORS=0x00所以看起来正确吗?
猜你喜欢
  • 2017-10-23
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多