我可能更喜欢使用pressly / chi,但我想它没有任何区别。我想像给出了一个像example.com/Jd8saD.jpg?resize=420x320&fit=crop&rotate=90
这样的输入网址,那么由于r.Get("/:image", ImageGET)
,它会转到以下GET函数:
function ImageGET(w http.ResponseWriter, r *http.Request) {
if r.URL.Query().Get("resize") != "" {
// do something
}
if r.URL.Query().Get("crop") != "" {
// do something
}
if r.URL.Query().Get("watermark") != "" {
// do something
}
etc
}
现在,我的问题是,我应该如何设计图像处理的任何功能,以便它能够正确有效地处理所有内容?我不希望你编写能够处理调整大小的代码,但这些函数将如何显示?也许:
function Resize(size string) (imgfile?, error) {
// the resize stuff
}
即使返回imgfile
会是什么?包含一些相关img信息的结构?
答案 0 :(得分:1)
可能,
imgfile
将满足image.Image
接口而不是保存在磁盘上的数据(即实际的jpg文件)
图像是有限的矩形网格颜色。颜色值取自颜色模型。
许多第三方golang图像库使用image.Image
来操纵图像。
我会使用imageGET
函数中的文件名检索(读取到内存)的标准image.Image
接口,并根据查询进行修改。您还可以从标准库中看到jpeg golang库。
function ImageGET(w http.ResponseWriter, r *http.Request) {
// GetJPEGImageFromFileSystem must decode os.File content and
// return a golang image.Image interface
img, _ := GetJPEGImageFromFileSystem(r.URL.Query().Get("filename"))
if r.URL.Query().Get("resize") != "" {
// If resizing, write over the image.Image in Memory,
// but not the image File on disk
img, _ = Resize(img, r.URL.Query().GET("resize"))
}
// etc...
}
function Resize(img image.Image, size string) (image.Image, error) {
// the resize stuff -- or, alternatively just call a dependency in the original handler to resize
return resizedImage, nil
}
答案 1 :(得分:1)
现在,我的问题是,我应该如何设计任何功能呢? 图像处理,以便它将正确处理所有事情 有效?
取决于您使用的包裹以及您想要用它做什么。如果您以imaging package为例,您会看到他们总是返回:*image.NRGBA
该类型实现image.Image
接口。
在下一步,您可以使用Encode function。
func编码(w io.Writer,img image.Image,format Format)错误
如您所见,该功能使用了io.Writer。
function ImageGET(w http.ResponseWriter, r *http.Request) {
// ...
imaging.Encode(w,img,imaging.PNG)
// ...
所以你只需要在你的处理程序中使用编写器并准备就绪。
因此,为了保持您的功能正确,只需返回image.Image
界面。