我正在使用 go-bindata
编写一个 golang 程序嵌入图片资源,使用Asset(string) ([]byte, error)
函数访问资源。但是我现有的库代码是这样的:
func NewIconFromFile(filePath string) (uintptr, error) {
absFilePath, err := filepath.Abs(filePath)
if err != nil {
return 0, err
}
hicon, _, _ := LoadImage.Call(
0,
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(absFilePath))),
IMAGE_ICON,
0,
0,
LR_DEFAULTSIZE|LR_LOADFROMFILE)
if hicon == 0 {
return 0, errors.New("load image failed: " + filePath)
}
return hicon, nil
}
如何将这个函数重写为:
func NewIconFromRawBytes(imgBytes []byte) (uintptr, error)
所以它可以支持从 []byte
加载图像?有帮助吗?谢谢。
编辑:有 a similar c++ version question ,如何将它移植到 golang。
最佳答案
LoadImage()
处理直接内置到 Windows 可执行文件中的 Windows 资源。 go-bindata
似乎没有处理这些,直接用 Go 做这件事并不简单。
如果您希望能够编写一个 NewIconFromRawBytes()
从内存中创建一个 HICON
,您需要使用容易混淆的名称 CreateIconFromResourceEx()
功能。如果你这样做,你可能想要保留 the info in the answer here记在心里。
但是,如果这是一个图像而不是一个图标,并且您想要一个HBITMAP
,那么您需要做更多的工作来涉及CreateDIBSection()
功能。 The answer here shows what to do, though understanding it may be a bit harder.需要注意的是,CreateDIBSection()
会为您分配图像内存,因此您必须将其从 Go 复制到提供的内存位置。
旁注:如果您有 *image.RGBA
或 *image.NRGBA
,如果您想将其插入,则需要翻转字节HBITMAP
,因为 Windows 期望字节按 BGRA
顺序,而不是 RGBA
顺序。
关于winapi - 如何在golang中从windows `syscall`加载图片资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42848917/