如何从golang中的windows`syscall`加载图像资源?

时间:2017-03-17 03:51:10

标签: winapi go

我正在使用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。

1 个答案:

答案 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顺序。