はじめに
golangで画像ファイルを開いて、画像サイズを取得するプログラムを書いていた。特に問題はなく実行できた。
package main import ( "fmt" "image" _ "image/jpeg" "log" "os" ) func main() { file, err := os.Open("flower.jpg") if err != nil { log.Fatal(err) } defer file.Close() conf, _, err := image.DecodeConfig(file) if err != nil { log.Fatal(err) } fmt.Printf("Width=%d, Height=%d\n", conf.Width, conf.Height) }
$ go run imgdecode.go Width=640, Height=427 $ identify flower.jpg flower.jpg JPEG 640x427 640x427+0+0 8-bit sRGB 143KB 0.000u 0:00.00
次に試したこと
画像処理を行おうとして、続けて次のようにしてみると、unknown formatになってしまった。
img, _, err := image.Decode(file) if err != nil { log.Fatal(err) } fmt.Println(img.At(0, 0))
$ go run imgdecode.go Width=640, Height=427 2014/10/13 22:54:17 image: unknown format exit status 1
os.Openをやり直す
image.Decode()の前に、もう一度os.Openするとunknown formatは出なくなった。
file, err = os.Open("flower.jpg") img, _, err := image.Decode(file) if err != nil { log.Fatal(err) } fmt.Println(img.At(0, 0))
image.DecodeConfigとimage.Decode
なぜだろう? image.DecodeConfigに画像ファイルの先頭バイトを読んでフォーマットを判定する処理があるけど、次にDecodeで同じ処理をした時に先頭が進んでいてフォーマット判定不能になっているとか? rewindみたいなことをしないといけないのかな。 要調査です。