diff --git a/weed/images/rotate.go b/weed/images/rotate.go new file mode 100644 index 000000000..9e26d602c --- /dev/null +++ b/weed/images/rotate.go @@ -0,0 +1,42 @@ +package images + +import ( + "bytes" + "image" + "image/color" + "image/gif" + "image/jpeg" + "image/png" + + "github.com/chrislusf/seaweedfs/weed/glog" + "github.com/disintegration/gift" +) + +func Rotate(ext string, data []byte, rotate int) (resized []byte) { + if rotate < 1 { + return data + } + srcImage, _, err := image.Decode(bytes.NewReader(data)) + if err == nil { + var dstImage *image.NRGBA + g := gift.New( + gift.Rotate(float32(rotate), color.Opaque, gift.CubicInterpolation), + ) + dstImage = image.NewNRGBA(g.Bounds(srcImage.Bounds())) + g.Draw(dstImage, srcImage) + + var buf bytes.Buffer + switch ext { + case ".png": + png.Encode(&buf, dstImage) + case ".jpg", ".jpeg": + jpeg.Encode(&buf, dstImage, nil) + case ".gif": + gif.Encode(&buf, dstImage, nil) + } + return buf.Bytes() + } else { + glog.Error(err) + } + return data +} diff --git a/weed/server/volume_server_handlers_read.go b/weed/server/volume_server_handlers_read.go index 6944e79e0..cdc88d442 100644 --- a/weed/server/volume_server_handlers_read.go +++ b/weed/server/volume_server_handlers_read.go @@ -132,6 +132,17 @@ func (vs *VolumeServer) GetOrHeadHandler(w http.ResponseWriter, r *http.Request) height, _ = strconv.Atoi(r.FormValue("height")) } n.Data, _, _ = images.Resized(ext, n.Data, width, height) + + //旋转 + if r.FormValue("rotate") != "" { + rotate, _ := strconv.Atoi(r.FormValue("rotate")) + n.Data = images.Rotate(ext, n.Data, rotate) + } + } + + //重命名 + if r.FormValue("rename") != "" { + filename = r.FormValue("rename") } if e := writeResponseContent(filename, mtype, bytes.NewReader(n.Data), w, r); e != nil { diff --git a/weed/weed b/weed/weed new file mode 100755 index 000000000..10e161173 Binary files /dev/null and b/weed/weed differ