在Go

时间:2017-05-01 16:59:50

标签: go vips

我可能更喜欢使用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信息的结构?

2 个答案:

答案 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界面。