diff --git a/dsSupport/Test/CutPhotoTest/CutPhotoTest.go b/dsSupport/Test/CutPhotoTest/CutPhotoTest.go new file mode 100644 index 00000000..b614339b --- /dev/null +++ b/dsSupport/Test/CutPhotoTest/CutPhotoTest.go @@ -0,0 +1,29 @@ +package main + +import ( + "dsSupport/Utils/ImageUtil" + "fmt" + "os" + "strings" +) + +func main() { + //源图片 + src := "g:/IMG_20200512_114233.jpg" + //目标图片名称 + dst := strings.Replace(src, ".", "_small.", 1) + fmt.Println("src=", src, " dst=", dst) + + //打开源文件 + fIn, _ := os.Open(src) + defer fIn.Close() + //创建目标文件 + fOut, _ := os.Create(dst) + defer fOut.Close() + + //缩放 + err := ImageUtil.Scale(fIn, fOut, 800, 600, 100) + if err != nil { + panic(err) + } +} diff --git a/dsSupport/Utils/ImageUtil/ImageUtil.go b/dsSupport/Utils/ImageUtil/ImageUtil.go new file mode 100644 index 00000000..28e3740f --- /dev/null +++ b/dsSupport/Utils/ImageUtil/ImageUtil.go @@ -0,0 +1,91 @@ +package ImageUtil + +import ( + "errors" + "github.com/nfnt/resize" + "golang.org/x/image/bmp" + "image" + "image/gif" + "image/jpeg" + "image/png" + "io" +) + +/* +* 图片裁剪 +* 入参: +* 规则:如果精度为0则精度保持不变 +* +* 返回:error + */ +func Clip(in io.Reader, out io.Writer, x0, y0, x1, y1, quality int) error { + origin, fm, err := image.Decode(in) + if err != nil { + return err + } + + switch fm { + case "jpeg": + img := origin.(*image.YCbCr) + subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.YCbCr) + return jpeg.Encode(out, subImg, &jpeg.Options{quality}) + case "png": + switch origin.(type) { + case *image.NRGBA: + img := origin.(*image.NRGBA) + subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.NRGBA) + return png.Encode(out, subImg) + case *image.RGBA: + img := origin.(*image.RGBA) + subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.RGBA) + return png.Encode(out, subImg) + } + case "gif": + img := origin.(*image.Paletted) + subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.Paletted) + return gif.Encode(out, subImg, &gif.Options{}) + case "bmp": + img := origin.(*image.RGBA) + subImg := img.SubImage(image.Rect(x0, y0, x1, y1)).(*image.RGBA) + return bmp.Encode(out, subImg) + default: + return errors.New("ERROR FORMAT") + } + return nil +} + +/* +* 缩略图生成 +* 入参: +* 规则: 如果width 或 hight其中有一个为0,则大小不变 如果精度为0则精度保持不变 +* 矩形坐标系起点是左上 +* 返回:error + */ +func Scale(in io.Reader, out io.Writer, width, height, quality int) error { + origin, fm, err := image.Decode(in) + if err != nil { + return err + } + if width == 0 || height == 0 { + width = origin.Bounds().Max.X + height = origin.Bounds().Max.Y + } + if quality == 0 { + quality = 100 + } + canvas := resize.Thumbnail(uint(width), uint(height), origin, resize.Lanczos3) + + switch fm { + case "jpeg": + return jpeg.Encode(out, canvas, &jpeg.Options{quality}) + case "png": + return png.Encode(out, canvas) + case "gif": + return gif.Encode(out, canvas, &gif.Options{}) + case "bmp": + return bmp.Encode(out, canvas) + default: + return errors.New("ERROR FORMAT") + } + return nil +} diff --git a/dsSupport/go.mod b/dsSupport/go.mod index 599b6043..98fc5ffb 100644 --- a/dsSupport/go.mod +++ b/dsSupport/go.mod @@ -10,8 +10,10 @@ require ( github.com/minio/minio-go/v6 v6.0.57 github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/nfnt/resize v0.0.0-20180221191011-83c6a9932646 github.com/robfig/cron/v3 v3.0.0 github.com/satori/go.uuid v1.2.0 + golang.org/x/image v0.0.0-20200618115811-c13761719519 golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae // indirect google.golang.org/protobuf v1.25.0 // indirect gopkg.in/ini.v1 v1.57.0 diff --git a/dsSupport/go.sum b/dsSupport/go.sum index adb6bc4e..3fa8dbdb 100644 --- a/dsSupport/go.sum +++ b/dsSupport/go.sum @@ -71,6 +71,8 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLD github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +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/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/robfig/cron/v3 v3.0.0 h1:kQ6Cb7aHOHTSzNVNEhmp8EcWKLb4CbiMW9h9VyIhO4E= @@ -92,6 +94,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/image v0.0.0-20200618115811-c13761719519 h1:1e2ufUJNM3lCHEY5jIgac/7UTjd6cgJNdatjPdFWf34= +golang.org/x/image v0.0.0-20200618115811-c13761719519/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=