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とかで処理した画面の出力用程度には充分戦えそうですね。

とまぁ、そういうお話でしたー。

keyword : Go言語 golang draw jpeg