winapi - 如何在golang中从windows `syscall`加载图片资源?

标签 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。

最佳答案

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/

相关文章:

c++ - hwnd 窗口中的文本格式和字体更改

c - 在 visual studio 中为 win32 项目引用其他项目

c - 如何在C中的窗口上显示两个位图图像

go - 将 Sudosh 与 Golang 结合使用

javascript - 使用 GoLang http.FileServer 时找不到 React 脚本

c - 隐藏/显示选项卡控件 Win32 的子窗口

c++ - 在 Win32 中确定按键和按键的最快方法是什么?

go - 写入 TOML 文件时发现重复键; tree.Has() 没有按预期工作

go - 在测试 golang 期间 stub time.Now() ?

go - git2go 中的 SSH 身份验证