diff --git a/routers/badge/badge.go b/routers/badge/badge.go index 5344b4e39..5e4efcdbf 100644 --- a/routers/badge/badge.go +++ b/routers/badge/badge.go @@ -112,6 +112,7 @@ func UploadIcon(ctx *context.Context, form badge.IconUploadForm) { FileMaxSize: setting.BadgeIconMaxFileSize, FileMaxWidth: setting.BadgeIconMaxWidth, FileMaxHeight: setting.BadgeIconMaxHeight, + NeedSquare: true, }) iconName, err := uploader.Upload(form, ctx.User) if err != nil { diff --git a/services/badge/icon.go b/services/badge/icon.go index ae7c25241..fd731b586 100644 --- a/services/badge/icon.go +++ b/services/badge/icon.go @@ -8,6 +8,8 @@ import ( "crypto/md5" "errors" "fmt" + "github.com/nfnt/resize" + "github.com/oliamb/cutter" "image" "image/png" "io/ioutil" @@ -27,6 +29,9 @@ type IconUploadConfig struct { FileMaxSize int64 FileMaxWidth int FileMaxHeight int + DefaultSize uint + NeedResize bool + NeedSquare bool } func NewIconUploader(config IconUploadConfig) IconUploader { @@ -105,5 +110,31 @@ func (u IconUploader) prepare(data []byte) (*image.Image, error) { return nil, fmt.Errorf("Decode: %v", err) } + if u.Config.NeedSquare { + if imgCfg.Width != imgCfg.Height { + var newSize, ax, ay int + if imgCfg.Width > imgCfg.Height { + newSize = imgCfg.Height + ax = (imgCfg.Width - imgCfg.Height) / 2 + } else { + newSize = imgCfg.Width + ay = (imgCfg.Height - imgCfg.Width) / 2 + } + + img, err = cutter.Crop(img, cutter.Config{ + Width: newSize, + Height: newSize, + Anchor: image.Point{ax, ay}, + }) + if err != nil { + return nil, err + } + } + } + + if u.Config.NeedResize && u.Config.DefaultSize > 0 { + img = resize.Resize(u.Config.DefaultSize, u.Config.DefaultSize, img, resize.NearestNeighbor) + } + return &img, nil }