aboutsummaryrefslogtreecommitdiff
path: root/weed/images
diff options
context:
space:
mode:
authormonchickey <75814968+monchickey@users.noreply.github.com>2023-01-07 01:28:07 +0800
committerGitHub <noreply@github.com>2023-01-06 09:28:07 -0800
commit3e2c9ea73ddc577da64e5c8596f8faae884c6840 (patch)
treedf9d61802f54183ad6471a36cc854b2b592ad749 /weed/images
parent296fdc296c8bd672d86c9aef19e9f568dab1b8a0 (diff)
downloadseaweedfs-3e2c9ea73ddc577da64e5c8596f8faae884c6840.tar.xz
seaweedfs-3e2c9ea73ddc577da64e5c8596f8faae884c6840.zip
Add image cropping. (#4117)
Diffstat (limited to 'weed/images')
-rw-r--r--weed/images/cropping.go47
-rw-r--r--weed/images/cropping_test.go22
2 files changed, 69 insertions, 0 deletions
diff --git a/weed/images/cropping.go b/weed/images/cropping.go
new file mode 100644
index 000000000..07a3f41ad
--- /dev/null
+++ b/weed/images/cropping.go
@@ -0,0 +1,47 @@
+package images
+
+import (
+ "bytes"
+ "image"
+ "image/gif"
+ "image/jpeg"
+ "image/png"
+ "io"
+
+ "github.com/disintegration/imaging"
+
+ "github.com/seaweedfs/seaweedfs/weed/glog"
+)
+
+func Cropped(ext string, read io.ReadSeeker, x1, y1, x2, y2 int) (cropped io.ReadSeeker, err error) {
+ srcImage, _, err := image.Decode(read)
+ if err != nil {
+ glog.Error(err)
+ return read, err
+ }
+
+ bounds := srcImage.Bounds()
+ if x2 > bounds.Dx() || y2 > bounds.Dy() {
+ read.Seek(0, 0)
+ return read, nil
+ }
+
+ rectangle := image.Rect(x1, y1, x2, y2)
+ dstImage := imaging.Crop(srcImage, rectangle)
+ var buf bytes.Buffer
+ switch ext {
+ case ".jpg", ".jpeg":
+ if err = jpeg.Encode(&buf, dstImage, nil); err != nil {
+ glog.Error(err)
+ }
+ case ".png":
+ if err = png.Encode(&buf, dstImage); err != nil {
+ glog.Error(err)
+ }
+ case ".gif":
+ if err = gif.Encode(&buf, dstImage, nil); err != nil {
+ glog.Error(err)
+ }
+ }
+ return bytes.NewReader(buf.Bytes()), err
+}
diff --git a/weed/images/cropping_test.go b/weed/images/cropping_test.go
new file mode 100644
index 000000000..284432e3a
--- /dev/null
+++ b/weed/images/cropping_test.go
@@ -0,0 +1,22 @@
+package images
+
+import (
+ "bytes"
+ "os"
+ "testing"
+
+ "github.com/seaweedfs/seaweedfs/weed/util"
+)
+
+func TestCropping(t *testing.T) {
+ fname := "sample1.jpg"
+
+ dat, _ := os.ReadFile(fname)
+
+ cropped, _ := Cropped(".jpg", bytes.NewReader(dat), 1072, 932, 1751, 1062)
+ buf := new(bytes.Buffer)
+ buf.ReadFrom(cropped)
+
+ util.WriteFile("cropped1.jpg", buf.Bytes(), 0644)
+
+}