Created
March 19, 2020 10:11
-
-
Save evalphobia/2ec4764f3c9f8c64c190bb3e5aeb72c9 to your computer and use it in GitHub Desktop.
Resizing Image (Jpeg) for golang
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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