Skip to content
Snippets Groups Projects
Commit 115353d6 authored by Jake Taylor's avatar Jake Taylor
Browse files

added image compression api

parent 8bb20522
No related branches found
No related tags found
2 merge requests!117Release,!85added image compression api
///////////////////////////////////////////////////////////////////////////////
// Copyright © 2020 xx network SEZC //
// //
// Use of this source code is governed by a license that can be found in the //
// LICENSE file //
///////////////////////////////////////////////////////////////////////////////
// Provides various utility functions for access over the bindings
package api
import (
"bytes"
"github.com/nfnt/resize"
"github.com/pkg/errors"
"image/jpeg"
"math"
)
const (
// Maximum input image size (in bytes)
maxSize int64 = 12000000
// Desired number of pixels in output image
desiredSize = 307200
)
// CompressJpeg takes a JPEG image in byte format
// and compresses it based on the above consts
func CompressJpeg(imgBytes []byte) ([]byte, error) {
// Convert bytes to a reader
imgBuf := bytes.NewReader(imgBytes)
// Ensure the size of the image is under the limit
if imgSize := imgBuf.Size(); imgSize > maxSize {
return nil, errors.Errorf("Image is too large: %d/%d", imgSize, maxSize)
}
// Decode the image information
imgInfo, err := jpeg.DecodeConfig(imgBuf)
if err != nil {
return nil, errors.Errorf("Unable to decode image config: %+v", err)
}
// If the dimensions of the image are below desiredSize, no compression is required
if imgInfo.Width*imgInfo.Height < desiredSize {
return imgBytes, nil
}
// Reset the buffer to the beginning to begin decoding the image
_, err = imgBuf.Seek(0, 0)
if err != nil {
return nil, errors.Errorf("Unable to reset image buffer: %+v", err)
}
// Decode image into image.Image object
img, err := jpeg.Decode(imgBuf)
if err != nil {
return nil, errors.Errorf("Unable to decode image: %+v", err)
}
// Determine the new width of the image based on desiredSize
newWidth := uint(math.Sqrt(float64(desiredSize * (imgInfo.Width / imgInfo.Height))))
// Resize the image based on newWidth while preserving aspect ratio
newImg := resize.Resize(newWidth, 0, img, resize.Bicubic)
// Encode the new image to a buffer
var newImgBuf *bytes.Buffer
err = jpeg.Encode(newImgBuf, newImg, nil)
if err != nil {
return nil, errors.Errorf("Unable to encode image: %+v", err)
}
// Return the compressed image in byte form
return newImgBuf.Bytes(), nil
}
......@@ -8,6 +8,7 @@ require (
github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00 // indirect
github.com/magiconair/properties v1.8.4 // indirect
github.com/mitchellh/mapstructure v1.4.0 // indirect
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646
github.com/pelletier/go-toml v1.8.1 // indirect
github.com/pkg/errors v0.9.1
github.com/smartystreets/assertions v1.0.1 // indirect
......
......@@ -167,6 +167,8 @@ github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 h1:zYyBkD/k9seD2A7fsi6Oo2LfFZAehjjQMERAvZLEDnQ=
github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646/go.mod h1:jpp1/29i3P1S/RLdc7JQKbRpFeM1dOBd8T9ki5s+AY8=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment