2017-03-17 92 views
0

我正在編寫使用go-bindata的golang程序來嵌入圖像資源,並使用Asset(string) ([]byte, error)函數訪問資源。但我的現有庫的代碼是這樣的:如何在golang中從windows'syscall`加載圖片資源?

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

你爲什麼要返回'uintptr'? – Flimzy

+0

什麼是LoadImage?在你的代碼中似乎有很多假設沒有被充分解釋以提供答案。 – Flimzy

+0

@apxp:這不是警告的意思,並且在您看到「不安全」時盲目重複是沒有用的。 Go中的許多事物都需要'unsafe'包裝,例如使用'sys' /'syscall'軟件包,並且在未來版本中完全支持正確使用。該警告意味着可能會以依賴於內部實現或平臺特定細節的方式使用不安全,而不是簡單地導入它會使您的程序不合規。 – JimB

回答

1

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字節。