在 Go 中给定多个 URL 参数的过程图像
Process image given multiple URL parameters in Go
我可能更愿意使用 pressly/chi,但我想这没什么区别。我想象给定一个像这样的输入 URL 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 信息的结构?
可能,
imgfile
将满足image.Image
接口而不是磁盘上保存的数据(即实际的jpg文件)
Image is a finite rectangular grid of color.Color values taken from a color model.
许多第 3 方 golang 图像库使用 image.Image
来处理图像。
我会使用标准 image.Image
接口,通过 imageGET
函数中的文件名检索(读取到内存)并根据查询进行修改。您还可以从标准库中查看 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
}
Now, my question is, how should I design whatever function does the
image processing so that it will process everything properly and
efficiently?
取决于您使用的包裹以及您想用它做什么。例如,如果您查找 imaging package you see that they return always: *image.NRGBA
该类型实现了 image.Image
接口。
下一步您可以使用 Encode function。
func Encode(w io.Writer, img image.Image, format Format) error
如您所见,该函数使用 io.Writer。
function ImageGET(w http.ResponseWriter, r *http.Request) {
// ...
imaging.Encode(w,img,imaging.PNG)
// ...
所以您只需要使用那里的处理程序中的编写器并准备就绪。
因此,为了保持您的功能正确,只需 return image.Image
界面。
我可能更愿意使用 pressly/chi,但我想这没什么区别。我想象给定一个像这样的输入 URL example.com/Jd8saD.jpg?resize=420x320&fit=crop&rotate=90
,然后它会因为 r.Get("/:image", ImageGET)
:
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 信息的结构?
可能,
imgfile
将满足image.Image
接口而不是磁盘上保存的数据(即实际的jpg文件)
Image is a finite rectangular grid of color.Color values taken from a color model.
许多第 3 方 golang 图像库使用 image.Image
来处理图像。
我会使用标准 image.Image
接口,通过 imageGET
函数中的文件名检索(读取到内存)并根据查询进行修改。您还可以从标准库中查看 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
}
Now, my question is, how should I design whatever function does the image processing so that it will process everything properly and efficiently?
取决于您使用的包裹以及您想用它做什么。例如,如果您查找 imaging package you see that they return always: *image.NRGBA
该类型实现了 image.Image
接口。
下一步您可以使用 Encode function。
func Encode(w io.Writer, img image.Image, format Format) error
如您所见,该函数使用 io.Writer。
function ImageGET(w http.ResponseWriter, r *http.Request) {
// ...
imaging.Encode(w,img,imaging.PNG)
// ...
所以您只需要使用那里的处理程序中的编写器并准备就绪。
因此,为了保持您的功能正确,只需 return image.Image
界面。