在 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 界面。