【问题标题】:Serve a decoded image via Martini通过 Martini 提供解码图像
【发布时间】:2014-04-29 05:18:02
【问题描述】:

我目前正在玩 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; charset=utf-8”,如下所示:

<*image.RGBA64 Value>

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

提前致谢!

【问题讨论】:

    标签: go martini


    【解决方案1】:

    可以直接写入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()
    }
    

    【讨论】:

    • @sontags 太棒了,很高兴能提供帮助...考虑接受这个作为答案。
    猜你喜欢
    • 2014-05-05
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2011-03-02
    • 2011-02-22
    • 1970-01-01
    相关资源
    最近更新 更多