本文实例讲述了基于.net实现裁剪网站上传图片的方法。由于客户端Javascript不能操作文件,所以只能先上传图片再在服务器端剪切。
1、上传图片
2、Javascript剪切图片(其实只是选取要剪切的部分)
3、服务器端剪切
(1)在页面的cs文件中剪切。须放几个隐藏控件以便回传js选取的坐标。
其中剪切图片源码如下:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.Drawing;
publicclassCut
{
/// <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>
publicstaticvoid CutImage(stringsourceImg,stringdesImg,intleft,inttop,intwidth,intheight)
{
System.Drawing.Image img = System.Drawing.Bitmap.FromFile(sourceImg);
System.Drawing.Image imgToSave = newSystem.Drawing.Bitmap(width, height);
System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(imgToSave);
RectangleF sourceRect = newRectangleF(left, top, width, height);
RectangleF destinationRect = newRectangleF(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中剪切,可回传文件流。用参数传递坐标。
usingSystem;
usingSystem.Web;
usingSystem.Drawing;
usingSystem.IO;
publicclassImgCropper_WebHandler : IHttpHandler
{
publicvoidProcessRequest(HttpContext context)
{
stringPic = Convert.ToString(context.Request["p"]);
intPointX = Convert.ToInt32(context.Request["x"]);
intPointY = Convert.ToInt32(context.Request["y"]);
intCutWidth = Convert.ToInt32(context.Request["w"]);
intCutHeight = Convert.ToInt32(context.Request["h"]);
intPicWidth = Convert.ToInt32(context.Request["pw"]);
intPicHeight = 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);
}
publicMemoryStream ResetImg(HttpContext context, stringImgFile,intPicWidth,intPicHeight,intPointX,intPointY,intCutWidth,intCutHeight)
{
Image imgPhoto = Image.FromFile(ImgFile);
Bitmap bmPhoto = newBitmap(CutWidth, CutHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Graphics gbmPhoto = Graphics.FromImage(bmPhoto);
gbmPhoto.DrawImage(imgPhoto,newRectangle(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 = newMemoryStream();
bmPhoto.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
imgPhoto.Dispose();
gbmPhoto.Dispose();
bmPhoto.Dispose();
returnms2;
}
publicboolIsReusable
{
get
{
returnfalse;
}
}
}