

Go言語で画像をダウンロードし、それを扱うためにImage構造体に変換するコードを作成したのですが、以下のエラーのためできませんでした。

[code]

    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
    }
    
[/code]

**エラー**

[code]

    image: unknown format
    
[/code]

これは上記コードの`image.Decode`で起きています。

今年の4月までは上記コードが動いていたのですが、今動かしたところエラーが出ました。Goのバージョンの違いだと思いますが、どのように修正すれば動くようにできるのでしょうか。

`image/jpeg`と`image/png`はインポートできています。

**問題を再現可能なコード**

[code]

    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
    
    }
    
[/code]


CC BY-SA 3.0
2016-07-05T07:26:00.863
27351
2016-07-06T03:35:17.637
2016-07-06T03:35:17.637
7232
7232
question
go
Goでネットからダウンロードした画像をデコードできない


要望: **不要な部分をなくして必要なコードを付与した問題を再現可能なコード** を質問に書いてください。

一応以下のコードで動作することは確認できました。

<https://play.golang.org/p/NTWLnceZlj>

[code]

    package main
    
    import (
        "bytes"
        "fmt"
        "image"
        _ "image/jpeg"
        "io/ioutil"
        "net/http"
        "os"
    )
    
    func getImage(url string) (image.Image, []byte, error) {
        resp, err := http.Get(url)
        if err != nil {
            return nil, nil, err
        }
        defer resp.Body.Close()
        fmt.Println(resp.StatusCode, resp.Status)
        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
    }
    
    func main() {
        img, data, err := getImage("http://safebooru.org/images/1715/d55b7029064f477ab3838c71456010896444d851.jpg")
        fmt.Println(img)
        fmt.Println(data)
        fmt.Println(err)
    }
    
[/code]

これで動きます。


CC BY-SA 3.0
2016-07-06T01:34:31.080
27366
2016-07-06T01:34:31.080
11051
27351
answer