package main import ( "bytes" "errors" "image/gif" "image/jpeg" "image/png" "io/ioutil" "github.com/nfnt/resize" ) // AvatarOriginalFileOutput ... type AvatarOriginalFileOutput struct { Directory string Size int } // SaveAvatar writes the original avatar to the file system. func (output *AvatarOriginalFileOutput) SaveAvatar(avatar *Avatar) error { // Determine file extension extension := avatar.Extension() if extension == "" { return errors.New("Unknown format: " + avatar.Format) } // Resize if needed data := avatar.Data img := avatar.Image if img.Bounds().Dx() > output.Size { img = resize.Resize(uint(output.Size), 0, img, resize.Lanczos3) buffer := new(bytes.Buffer) var err error switch extension { case ".jpg": err = jpeg.Encode(buffer, img, nil) case ".png": err = png.Encode(buffer, img) case ".gif": err = gif.Encode(buffer, img, nil) } if err != nil { return err } data = buffer.Bytes() } // Set user avatar avatar.User.AvatarExtension = extension // Write to file fileName := output.Directory + avatar.User.ID + extension return ioutil.WriteFile(fileName, data, 0644) }