12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- package images
- import (
- "bytes"
- "image"
- "image/gif"
- "image/jpeg"
- "image/png"
- "io"
- "github.com/cognusion/imaging"
- "github.com/seaweedfs/seaweedfs/weed/glog"
- _ "golang.org/x/image/webp"
- )
- func Resized(ext string, read io.ReadSeeker, width, height int, mode string) (resized io.ReadSeeker, w int, h int) {
- if width == 0 && height == 0 {
- return read, 0, 0
- }
- srcImage, _, err := image.Decode(read)
- if err == nil {
- bounds := srcImage.Bounds()
- var dstImage *image.NRGBA
- if bounds.Dx() > width && width != 0 || bounds.Dy() > height && height != 0 {
- switch mode {
- case "fit":
- dstImage = imaging.Fit(srcImage, width, height, imaging.Lanczos)
- case "fill":
- dstImage = imaging.Fill(srcImage, width, height, imaging.Center, imaging.Lanczos)
- default:
- if width == height && bounds.Dx() != bounds.Dy() {
- dstImage = imaging.Thumbnail(srcImage, width, height, imaging.Lanczos)
- w, h = width, height
- } else {
- dstImage = imaging.Resize(srcImage, width, height, imaging.Lanczos)
- }
- }
- } else {
- read.Seek(0, 0)
- return read, bounds.Dx(), bounds.Dy()
- }
- var buf bytes.Buffer
- switch ext {
- case ".png":
- png.Encode(&buf, dstImage)
- case ".jpg", ".jpeg":
- jpeg.Encode(&buf, dstImage, nil)
- case ".gif":
- gif.Encode(&buf, dstImage, nil)
- case ".webp":
- // Webp does not have golang encoder.
- png.Encode(&buf, dstImage)
- }
- return bytes.NewReader(buf.Bytes()), dstImage.Bounds().Dx(), dstImage.Bounds().Dy()
- } else {
- glog.Error(err)
- }
- return read, 0, 0
- }
|