通过Martini提供解码图像

时间:2014-03-21 17:27:48

标签: go martini

我目前正在玩golang和Martini等,并希望动态地提供一些被操纵/生成的图像。这是一个最小的例子:

package main

import (
    "github.com/codegangsta/martini"
    "github.com/nfnt/resize"
    "image"
    "image/jpeg"
    "log"
    "os"
)

func thumb() image.Image {
    file, err := os.Open("test.jpg")
    if err != nil {
        log.Fatal(err)
    }

    img, err := jpeg.Decode(file)
    if err != nil {
        log.Fatal(err)
    }
    file.Close()

    m := resize.Resize(0, 200, img, resize.MitchellNetravali)

    return m
}

func main() {
    m := martini.Classic()
    m.Get("/") image.Image {
        return thumb()
    })
    m.Run()
}

那编译得很好,但是我得到了一些" Content-Type:text / plain;而不是提供图像。字符集= UTF-8"看起来像这样:

<*image.RGBA64 Value>

我很确定我需要再次对图像进行编码然后再进行处理。但我不太确定如何在不将图像保存到磁盘的情况下执行此操作...

提前致谢!

1 个答案:

答案 0 :(得分:7)

您可以直接写入ResponseWriter,因为它实现了io.Writer接口,无需使用缓冲区或将映像复制到磁盘。

你几乎就在那里,只需要设置内容类型,就像你提到的那样将image.Image对象编码回jpeg。幸运的是,jpeg.Encode()方法需要写入一个编写器,并且您可以随时使用ResponseWriter,这要归功于Martini能够将其注入您的处理程序。

注意:您可能希望执行比我提供的更强大的错误处理工作。这只是为了让球滚动。 ;)

package main

import (
    "image"
    "image/jpeg"
    "log"
    "net/http"
    "os"

    "github.com/codegangsta/martini"
    "github.com/nfnt/resize"
)

func thumb() image.Image {
    file, err := os.Open("test.jpg")
    if err != nil {
        log.Fatal(err)
    }

    img, err := jpeg.Decode(file)
    if err != nil {
        log.Fatal(err)
    }
    file.Close()

    m := resize.Resize(0, 200, img, resize.MitchellNetravali)

    return m
}

func main() {
    m := martini.Classic()

    m.Get("/", func(res http.ResponseWriter, req *http.Request) {
        res.Header().Set("Content-Type", "image/jpeg")
        err := jpeg.Encode(res, thumb(), &jpeg.Options{100})
        if err != nil {
            res.WriteHeader(500)
        } else {
            res.WriteHeader(200)
        }
    })
    m.Run()
}