package image import ( "bytes" "errors" "github.com/nfnt/resize" "image" "image/jpeg" "image/png" "strings" ) func CreateThumbnail(fileBytes []byte, side, width, height int) ([]byte, error) { img, format, err := image.Decode(bytes.NewReader(fileBytes)) if err != nil { return nil, err } var thumbnailImg image.Image if side > 0 { var canvas image.Image s := side sz := img.Bounds().Size() if sz.X > sz.Y { canvas = resize.Thumbnail(uint(sz.X), uint(s), img, resize.Lanczos2) } else { canvas = resize.Thumbnail(uint(s), uint(sz.Y), img, resize.Lanczos2) } sz = canvas.Bounds().Size() var l, t, r, b int if sz.X > s { l = (sz.X - s) / 2 r = l + s } else { l = 0 r = sz.X } if sz.Y > s { t = (sz.Y - s) / 2 b = t + s } else { t = 0 b = sz.Y } if ycbcr, ok := canvas.(*image.YCbCr); ok { thumbnailImg = ycbcr.SubImage(image.Rect(l, t, r, b)).(*image.YCbCr) } else if rgba, ok := canvas.(*image.RGBA); ok { thumbnailImg = rgba.SubImage(image.Rect(l, t, r, b)).(*image.RGBA) } else { return nil, errors.New("未识别的图片色彩类型") } } else { w := width h := height if w > 0 && h > 0 { } else if w > 0 { h = img.Bounds().Dy() } else { w = img.Bounds().Dx() } thumbnailImg = resize.Thumbnail(uint(w), uint(h), img, resize.Lanczos2) } buffer := new(bytes.Buffer) format = strings.ToLower(format) if format == "jpg" || format == "jpeg" { if err := jpeg.Encode(buffer, thumbnailImg, nil); err != nil { return nil, err } } else if format == "png" { if err := png.Encode(buffer, thumbnailImg); err != nil { return nil, err } } else { return nil, errors.New("不支持的文件格式") } return buffer.Bytes(), nil }