我正在使用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。
答案 0 :(得分:1)
LoadImage()
处理Windows资源,这些资源直接内置于Windows可执行文件中。 go-bindata
似乎没有解决这些问题,直接用Go做这件事并非易事。
如果您希望能够编写一个从内存中创建NewIconFromRawBytes()
的{{1}},则需要使用容易混淆的CreateIconFromResourceEx()
函数。如果您这样做,可能需要牢记the info in the answer here。
但是,如果这是一个图像而不是一个图标而你想要一个HICON
,那么你需要做更多的工作来处理CreateDIBSection()
函数。 The answer here shows what to do, though understanding it may be a bit harder.重要的是HBITMAP
为您分配图像内存,因此您必须将其从Go复制到提供的内存位置。
旁注:如果您有CreateDIBSection()
或*image.RGBA
,如果您想将其推送到*image.NRGBA
,则需要翻转字节,因为Windows需要字节按HBITMAP
顺序,而不是BGRA
顺序。