gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:12:20 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com