Goでネットからダウンロードした画像をデコードできない
Go言語で画像をダウンロードし、それを扱うためにImage構造体に変換するコードを作成したのですが、以下のエラーのためできませんでした。
func getImage(url string) (image.Image, []byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, nil, err
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, nil, err
}
buf := bytes.NewBuffer(data)
img, _, err := image.Decode(buf)
if err != nil {
return nil, nil, err
}
return img, data, nil
}
エラー
image: unknown format
これは上記コードのimage.Decode
で起きています。
今年の4月までは上記コードが動いていたのですが、今動かしたところエラーが出ました。Goのバージョンの違いだと思いますが、どのように修正すれば動くようにできるのでしょうか。
image/jpeg
とimage/png
はインポートできています。
問題を再現可能なコード
package main
import (
"bytes"
"image"
_ "image/jpeg"
"io/ioutil"
"log"
"net/http"
)
func main() {
doneCh := make(chan bool, 10)
for i := 0; i < 10; i++ {
go getImage("http://safebooru.org/images/1715/d55b7029064f477ab3838c71456010896444d851.jpg", doneCh)
}
for i := 0; i < 10; i++ {
<-doneCh
}
}
func getImage(url string, doneCh chan bool) {
resp, err := http.Get(url)
if err != nil {
log.Fatal("http.Get failed", err)
}
if resp.StatusCode != 200 {
log.Fatal("StatusCode is not 200", resp.StatusCode)
}
defer resp.Body.Close()
data, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal("ioutil.ReadAll failed", err)
}
buf := bytes.NewBuffer(data)
img, _, err := image.Decode(buf)
if err != nil {
log.Fatal("image.Decode failed", err)
}
_ = img
log.Printf("OK: Bounds=%+v\n", img.Bounds())
doneCh <- true
}