64 lines
1.2 KiB
Go
64 lines
1.2 KiB
Go
|
package flutter_image_compress
|
||
|
|
||
|
import (
|
||
|
"image"
|
||
|
"image/color"
|
||
|
_ "image/gif"
|
||
|
_ "image/jpeg"
|
||
|
_ "image/png"
|
||
|
"io"
|
||
|
"os"
|
||
|
|
||
|
"github.com/disintegration/imaging"
|
||
|
"github.com/nfnt/resize"
|
||
|
_ "golang.org/x/image/webp"
|
||
|
)
|
||
|
|
||
|
// Rotate image
|
||
|
func RotateImage(img image.Image, degree int) image.Image {
|
||
|
return imaging.Rotate(img, float64(degree), color.Transparent)
|
||
|
}
|
||
|
|
||
|
// Scale image
|
||
|
func ScaleImage(reader io.Reader, minWidth, minHeight int32) (img image.Image, err error) {
|
||
|
img, _, err = image.Decode(reader)
|
||
|
if err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
w, h := calcTargetSize(img, minHeight, minHeight)
|
||
|
|
||
|
img = resize.Resize(w, h, img, resize.Lanczos3)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func calcTargetSize(img image.Image, minWidth, minHeight int32) (uint, uint) {
|
||
|
srcW := float32(img.Bounds().Size().X)
|
||
|
srcH := float32(img.Bounds().Size().Y)
|
||
|
|
||
|
scaleW := srcW / float32(minWidth)
|
||
|
scaleH := srcH / float32(minHeight)
|
||
|
|
||
|
scale := scaleW
|
||
|
if scaleH < scaleW {
|
||
|
scale = scaleH
|
||
|
}
|
||
|
|
||
|
if scale < 1 {
|
||
|
scale = 1
|
||
|
}
|
||
|
|
||
|
return uint(srcW / scale), uint(srcH / scale)
|
||
|
}
|
||
|
|
||
|
func pathExists(path string) (bool, error) {
|
||
|
_, err := os.Stat(path)
|
||
|
if err == nil {
|
||
|
return true, nil
|
||
|
}
|
||
|
if os.IsNotExist(err) {
|
||
|
return false, nil
|
||
|
}
|
||
|
return false, err
|
||
|
}
|