1

我可能更喜欢使用 pressly/chi,但我想这没什么区别。我想给定这样的输入 URL example.com/Jd8saD.jpg?resize=420x320&fit=crop&rotate=90,然后它会转到以下 GET 函数,因为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 信息的结构?

4

2 回答 2

1

现在,我的问题是,我应该如何设计图像处理的任何功能,以便它能够正确有效地处理所有内容?

取决于您用于物品的包装以及您想用它做什么。例如,如果您查看映像包,您会看到它们总是返回:*image.NRGBA

该类型实现了image.Image接口。

在下一步您可以使用编码功能

func Encode(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接口。

于 2017-05-01T17:21:13.087 回答
1

很可能,

图像文件

将满足image.Image界面而不是保存在磁盘上的数据(即实际的 jpg 文件)

图像是一个有限的矩形颜色网格。颜色值取自颜色模型。

许多 3rd 方 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
}
于 2017-05-01T17:18:21.833 回答