stMind

about Arsenal, Arsene Wenger, Tech, Computer vision and Machine learning

golangのimageパッケージを使った時

はじめに

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みたいなことをしないといけないのかな。 要調査です。