利用GO语言开发了一个UFO探索网站,这里面我实现了动态生成缩略图功能,这与nginx等做法是一样的。
由于这些图片我都是存在服务器本地,没有使用七牛之类的第三方,所以操作起来非常方便。
生成缩略图主要分两步:
1.从输入的地址中取指定的宽、高及图片格式。
2.打开图片根据图片截取。
// 引入截图包
import "github.com/disintegration/imaging"
// 从图片地址获取宽高
arr := strings.Split(r.URL.Path, "_")
if len(arr) != 3 {
return nil, fmt.Errorf("error path %s", r.URL.Path)
}
widthS := arr[1]
fix := arr[2]
heightS := ""
if idx := strings.Index(fix, "."); idx != -1 {
heightS = fix[:idx]
fix = fix[idx+1:]
}
width, err := strconv.Atoi(widthS)
if err != nil {
return nil, err
}
height, err := strconv.Atoi(heightS)
if err != nil {
return nil, err
}
// 使用第三方截图包
// 最终得到的 imgBuf 就是一个 images.Image 得到这个东西之后你想怎么操作都简单了
w.Header().Set("Content-Type", "image/"+fix)
imgBuf = imaging.Fill(imgBuf, width, height, imaging.Center, imaging.Lanczos)
// 将imgbuf写入byte 这时候可以保存到硬盘 也可以直接就输出了
// 由于目的就是为了动态输出 不占用硬盘空间 所以直接输出即可
var b = bytes.NewBuffer(nil)
if fix == "png" {
if err = png.Encode(b, imgBuf); err != nil {
return nil, err
}
w.Write(b.Bytes())
}
参考资料:http://www.liehuts.com/weijiezhimi/936.html
里面的图片就是经过了动态截图的,使其宽度保持在800以内。