我目前正在玩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()
}
Run Code Online (Sandbox Code Playgroud)
这编译得很好,但是我没有提供图像,而是获得了一些"Content-Type:text/plain; charset = utf-8",如下所示:
<*image.RGBA64 Value>
Run Code Online (Sandbox Code Playgroud)
我很确定我需要再次对图像进行编码然后提供服务.但我不太确定如何在不将图像保存到磁盘的情况下执行此操作...
提前致谢!
您可以直接写入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()
}
Run Code Online (Sandbox Code Playgroud)