Skip to content

Instantly share code, notes, and snippets.

@evalphobia
Created March 19, 2020 10:11
Show Gist options
  • Save evalphobia/2ec4764f3c9f8c64c190bb3e5aeb72c9 to your computer and use it in GitHub Desktop.
Save evalphobia/2ec4764f3c9f8c64c190bb3e5aeb72c9 to your computer and use it in GitHub Desktop.
Resizing Image (Jpeg) for golang
package library
import (
"bytes"
"image"
"image/jpeg"
"io"
"github.com/disintegration/imaging"
)
const (
maxImageByteSize = 200 * 1024 // 200KB
maxImagePx = 1024 // px
jpegQuality = 90 // %
)
// 画像をリサイズする.
func ResizeImage(b []byte) ([]byte, error) {
if len(b) < maxImageByteSize {
return b, nil
}
r := bytes.NewReader(b)
img, err := imaging.Decode(r, imaging.AutoOrientation(true))
if err != nil {
return nil, err
}
resized := scaleDown(img)
// TODO: exifの書き戻し
var buf bytes.Buffer
if err := imaging.Encode(&buf, resized, imaging.JPEG, imaging.JPEGQuality(jpegQuality)); err != nil {
return nil, err
}
return buf.Bytes(), nil
}
// 画像を小さくリサイズする.
func scaleDown(src image.Image) image.Image {
rect := src.Bounds()
x := rect.Dx()
y := rect.Dy()
switch {
case maxImagePx > x && maxImagePx > y:
// サイズが小さい場合は何もしない
return src
case x > y:
return imaging.Resize(src, maxImagePx, 0, imaging.MitchellNetravali)
default:
return imaging.Resize(src, 0, maxImagePx, imaging.MitchellNetravali)
}
}
// IsJpegImage checks if the given bytes is jpeg file or not.
func IsJpegImage(b []byte) error {
return isJpegImage(bytes.NewReader(b))
}
func isJpegImage(r io.Reader) error {
_, err := jpeg.DecodeConfig(r)
return err
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment