ぷらこのきろく

メモとかテストとか備忘録とか

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型を適当にいじったりできないんかなぁ。。
そのうちやってみよう。