image/jpegパッケージでjpegを表示してみよう!
image/jpegとかってすげぇ便利なパッケージがあるんですよね。
関数一つでjpeg画像をデコードしてくれちゃう!
そういうわけで昨日のdrawパッケージ的なお話の続きです。
そういうわけで今日は昨日drawパッケージでウィンドウを表示させたりして遊んだので、
「ウインドウ表示できるならjpegパッケージとか楽しいんじゃね?」
っていう訳でjpegパッケージを使ってみます。
package main import ( "exp/draw" "exp/draw/x11" "image/jpeg" "fmt" "os" ) func main() { //create and get the window win,err := x11.NewWindow() if err != nil { fmt.Printf("%s\n",err.String()) return } /******************************************************************/ //open jpeg file f,err := os.Open(os.Args[1],os.O_RDONLY,0666) if err != nil { fmt.Printf("%s\n",err.String()) return } //decode jpeg data jimg,err := jpeg.Decode(f) if err != nil { fmt.Printf("%s\n",err.String()) return } //get image from Window img := win.Screen() //copy jpegimage to window for i:=0; i<img.Bounds().Size().X; i++ { for j:=0; j<img.Bounds().Size().Y; j++ { img.Set(i,j,jimg.At(i,j)) } } /******************************************************************/ for { //when event is occored, it can pull EventChan() evnt := <-win.EventChan() if mouse,ok := evnt.(draw.MouseEvent); ok == true { //if event is mousemoving(with type-assersion) fmt.Printf("mouse : (%d, %d) : %d\n", mouse.Loc.X, mouse.Loc.Y, mouse.Buttons) } else if key,ok := evnt.(draw.KeyEvent); ok == true { //if event is keypushing fmt.Printf("key : %d\n",key.Key) if key.Key == -101 { win.Close() break } } else if errev,ok := evnt.(draw.ErrEvent); ok == true{ fmt.Printf("error : %s",errev.Err.String()) } else if _,ok := evnt.(draw.ConfigEvent); ok == true { fmt.Printf("Config events\n") } else { fmt.Printf("unknown event. %T\n",evnt) return } } return }
第一引数で与えられたjpegファイルを読み込んで、デフォルトのウィンドウサイズが許す限りで表示します。
コード的には基本ほとんど同じ、昨日と違うのは線を引いた部分だけです。
もう説明するまでも無い感じですね、すっげー簡単です。
個人的にはdraw.Imageのところにjpeg.Decode()でできたimage.Imageを直接代入したくなるんですが、残念ながらそれはできないわけですね。
そういうわけでSet()とAt()を使ってループをまわしてやる必要があるようです。
もっと違うやり方があるよ!って知ってる人居たら教えてください。
そういうわけですので、
goのdrawパッケージはアプリケーション用のウィンドウとしては使い物になりませんが、
imageとかで処理した画面の出力用程度には充分戦えそうですね。
とまぁ、そういうお話でしたー。