2017-03-17 3 views
0

イメージリソースを埋め込むためにgo-bindataを使ってgolangプログラムを作成していて、Asset(string) ([]byte, error)関数を使用してリソースにアクセスしています。しかし、私の既存のライブラリのコードは次のように行く:それは[]byteからロードイメージにサポートすることができますgolangのウィンドウ `syscall`からイメージリソースをロードするには?

func NewIconFromRawBytes(imgBytes []byte) (uintptr, 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 
} 

どのように私はこの機能を書き換えることができますか?どんな助け?ありがとう。

編集:a similar c++ version questionがありますが、どうすればgolangに移植できますか。

+0

なぜあなたは 'uintptr'を返すのですか? – Flimzy

+0

'LoadImage'とは何ですか?あなたのコードには、答えを提供するために十分に説明されていない多くの仮定があるようです。 – Flimzy

+0

@apxp:これは警告の意味ではなく、「安全でない」と表示されるときはいつでも盲目的に繰り返すことは役に立ちません。 '安全でない'パッケージは、Goの多くのものに必要です。 'sys' /' syscall'パッケージを使用し、正しく使用された場合は、将来のバージョンで完全にサポートされます。この警告は、内部実装やプラットフォーム固有の詳細に依存する方法で安全でないものを使用する可能性があることを意味します。単純にインポートすると、プログラムが非準拠になります。 – JimB

答えて

1

LoadImage()は、Windowsの実行ファイルに直接組み込まれているWindowsリソースを扱います。 go-bindataはこれらを処理していないようで、Goと直接これを行うのは簡単ではありません。

メモリからHICONを作成するNewIconFromRawBytes()を書きたい場合は、わかりやすい名前の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からメモリ位置にコピーする必要があることです。

サイドノート:あなたはHBITMAPにそれを突き出すしたい場合は、WindowsがBGRAため、ないRGBAためにバイトを期待するよう*image.RGBAまたは*image.NRGBAが、あなたは、周りのバイトを反転する必要があります持っている場合。

関連する問題