客户端js不能操作文件,所以只能先上传图片再在服务器端剪切。
1、上传图片
2、js剪切图片(其实只是选取要剪切的部分)
3、服务器端剪切
(1)在页面的cs文件中剪切。须放几个隐藏控件以便回传js选取的坐标。
其中剪切图片源码:
- using System;
- using System.Collections.Generic;
- using System.Text;
- using System.Drawing;
- public class Cut
- {
- /// <summary>
- /// 裁剪图片
- /// </summary>
- /// <param name="sourceImg">原图片路径</param>
- /// <param name="desImg">裁剪图片路径</param>
- /// <param name="left">X</param>
- /// <param name="top">Y</param>
- /// <param name="width">宽</param>
- /// <param name="height">高</param>
- public static void CutImage(string sourceImg, string desImg, int left, int top, int width, int height)
- {
- System.Drawing.Image img = System.Drawing.Bitmap.FromFile(sourceImg);
- System.Drawing.Image imgToSave = new System.Drawing.Bitmap(width, height);
- System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(imgToSave);
- RectangleF sourceRect = new RectangleF(left, top, width, height);
- RectangleF destinationRect = new RectangleF(0, 0, width, height);
- g.DrawImage(img,
- destinationRect,
- sourceRect,
- GraphicsUnit.Pixel
- );
- g.Save();
- imgToSave.Save(desImg, System.Drawing.Imaging.ImageFormat.Jpeg);
- g.Dispose();
- imgToSave.Dispose();
- img.Dispose();
- }
- }
- (2)在ashx中剪切,可回传文件流。用参数传递坐标。
- Code
- using System;
- using System.Web;
- using System.Drawing;
- using System.IO;
- public class ImgCropper_WebHandler : IHttpHandler
- {
- public void ProcessRequest(HttpContext context)
- {
- string Pic = Convert.ToString(context.Request["p"]);
- int PointX = Convert.ToInt32(context.Request["x"]);
- int PointY = Convert.ToInt32(context.Request["y"]);
- int CutWidth = Convert.ToInt32(context.Request["w"]);
- int CutHeight = Convert.ToInt32(context.Request["h"]);
- int PicWidth = Convert.ToInt32(context.Request["pw"]);
- int PicHeight = Convert.ToInt32(context.Request["ph"]);
- context.Response.ContentType = "image/jpeg";
- ResetImg(context, System.Web.HttpContext.Current.Server.MapPath(Pic), PicWidth, PicHeight, PointX, PointY, CutWidth, CutHeight).WriteTo(context.Response.OutputStream);
- }
- public MemoryStream ResetImg(HttpContext context, string ImgFile, int PicWidth, int PicHeight, int PointX, int PointY, int CutWidth, int CutHeight)
- {
- Image imgPhoto = Image.FromFile(ImgFile);
- Bitmap bmPhoto = new Bitmap(CutWidth, CutHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
- Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
- gbmPhoto.DrawImage(imgPhoto, new Rectangle(0, 0, CutWidth, CutHeight), PointX * imgPhoto.Width / PicWidth, PointY * imgPhoto.Height / PicHeight, CutWidth * imgPhoto.Width / PicWidth, CutHeight * imgPhoto.Height / PicHeight, GraphicsUnit.Pixel);
- //保存图片到服务器
- bmPhoto.Save(context.Server.MapPath("upload/") + Guid.NewGuid() + ".jpg", System.Drawing.Imaging.ImageFormat.Jpeg);
- //生成文件流回传
- MemoryStream ms2 = new MemoryStream();
- bmPhoto.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
- imgPhoto.Dispose();
- gbmPhoto.Dispose();
- bmPhoto.Dispose();
- return ms2;
- }
- public bool IsReusable
- {
- get
- {
- return false;
- }
- }
- }