walk NewBitmapFromImage()
今日遊んだコードはこれ
package main import ( "github.com/lxn/walk" . "github.com/lxn/walk/declarative" ) import ( _ "go.image/bmp" ) import ( "fmt" "image" "image/color" "os" "log" ) func imgfromfilename(filename string) (img image.Image, err error) { file, err := os.Open(filename) if err != nil { return nil, err } defer file.Close() img,_, err = image.Decode(file) if err != nil { fmt.Println("Decode") return nil, err } return img, nil } type myimage struct { img image.Image } func (mi myimage) ColorModel() color.Model { return mi.img.ColorModel() } func (mi myimage) Bounds() image.Rectangle { return mi.img.Bounds() } func (mi myimage) At(x, y int) color.Color { col := mi.img.At(x, y) r, g, b, _ := col.RGBA() return color.RGBA{uint8(r+0xff), uint8(g)^0xff , uint8(0x88- uint8(b)) , uint8(0xff)} } func main() { var iv *walk.ImageView img, err := imgfromfilename("../tombo_big2.bmp") if err != nil { log.Fatal(err) return } myimg := myimage{img} bitmap, err := walk.NewBitmapFromImage(myimg) if err != nil { fmt.Println("NewBitmapFromImage") log.Fatal(err) return } imgsize := bitmap.Size() MainWindow{ Title: "hello", Size: Size{ Width: imgsize.Width, Height: imgsize.Height, }, Layout: VBox{ MarginsZero: true, }, Children: []Widget { ImageView { AssignTo: &iv, Image: bitmap, MaxSize: Size{ Width: imgsize.Width, Height: imgsize.Height, }, MinSize: Size{ Width: imgsize.Width, Height: imgsize.Height, }, }, }, }.Run() }
下準備
このコードを動かす前に、ちょっとだけ下準備がいった。
goの標準ライブラリでは、bmpは扱わなくなったっぽい
というわけで、それをとってこようとがんばってみる。
んで、ここを探すと、
hg clone https://code.google.com/p/go.image/
ってやれって書いてあって、もちろんhgなんてコマンド入っていないわけで、ここからとってきた。僕が入れたのは、Setup installer の does not admin rights というの。adminで入れるのは極力避けたい。
で、適当にインストールして、hgコマンドでとってきた。とってきた先のディレクトリは、
%GOPATH%\srcの下。とりあえずこの辺においておいた。
コードの説明
import宣言で、さっきとってきたgo.image/bmpを読み込む。
どうも読み込むだけで、image.Decode()とすれば、bmpだったらそのデータを読み込んでくれた。なので、"_"がついている。
imgfromfilename()で、ファイルからimage.Imageのデータに変換。
それだけでは面白くないので、自分でmyimage{}構造体を作って、変換してみた。
このやり方は、チュートリアルの練習問題にあったので、それを真似てやってみた。
そうやって作った、image.Image型のデータを、walk.NewBitmapFromImage(myimg)として*Bitmap型に変換。これはwalk.Image型としてImageView構造体のImageにそのままつっこめる。
今まで面倒くさかったのでやってなかったエラーチェックを適当にしているが、うまく動かなかった名残。
ちなみにうまく動かなかった原因は、bmpファイルがサポートされてない形式のものだったかららしい。一度gimpで読み込んでエクスポートして、その際に、互換性のところの、「色空間の情報を書き込まない」にチェックを入れたらうまくいった。なので、"tombo_big2.bmp"となってる。
って、ここまでやってきたが、image.Image型を通さなくても実は*Bitmap型を適当にいじったりできないんかなぁ。。
そのうちやってみよう。