上一阵子做过一个图片切割效果,得到很多人关注。其中有很多人向我询问如何做一个真正的图片切割(裁剪),这里需要声明一下:
首先js是不能操作客户端文件的(除非特殊情况),所以图片的切割必须在后台处理,对于客户端的图片可以先上传再切割或者把图片和切割参数一起传递到服务器再处理(上传文件不在本次讨论范围,请自行修改);
还有是通过客户端传递的参数来处理图片,确实能得到展示图或预览图的效果(这是针对有些提出在后台处理的图片得不到预览图的效果来说的),下面会举例说明如何生成展示图那样的图片。
程序说明
【客户端部分】
客户端部分详细请参考图片切割效果(建议没有看过的先看那里的例子),这里说说要传递到后台的参数,建议用GetPos获取部分参数:
var p = ic.Url, o = ic.GetPos();
x = o.Left,
y = o.Top,
w = o.Width,
h = o.Height,
pw = ic._layBase.width,
ph = ic._layBase.height;
其中,ic.Url是图片地址:ic.Url,o.Left是水平切割,o.Top是垂直切割点,o.Width是切割宽度,o.Height是切割高度,ic._layBase.width是图片宽度,ic._layBase.height是图片高度。
可以这样传递这些参数:
$("imgCreat").src = "ImgCropper.ashx?p=" + p + "&x=" + x + "&y=" + y + "&w=" + w + "&h=" + h + "&pw=" + pw + "&ph=" + ph + "&" + Math.random();
其中图片地址、图片宽度、图片高度如果是预先设定好的话就可以不传递了。
【后台部分】
后台主要是进行图片的处理和输出。
【图片切割】
在后台获取前台传递的参数:
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->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"]);
然后就用这些参数对图片进行切割了,先说说切割的原理,主要分两部:切割和缩放。
切割和缩放的程序关键在这里:
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);
首先是在原图切割出需要的部分。切割需要的参数是PointX、PointY、CutWidth、CutHeight,因为在客户端的程序中是可以缩放原图来进行切割的,所以要在在切割原图时需要先按比例缩放这些参数,还要注意PointX和CutWidth需要水平方向的比例,PointY和CutHeight需要垂直方向的比例。例如(其中imgPhoto是原图):
水平切割点:PointX * imgPhoto.Width / PicWidth;
切割宽度:CutWidth * imgPhoto.Width / PicWidth;
垂直切割点:PointY * imgPhoto.Height / PicHeight;
切割高度:CutHeight * imgPhoto.Height / PicHeight。
用这些参数就可以对原图进行切割了。
然后是缩放原图。可以想象,当切割好原图后,只要把图宽高缩放到CutWidth和CutHeight就可以得到跟展示图一样的图片了:
new Rectangle(0, 0, CutWidth, CutHeight),
下面是处理图片的程序:
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--> public MemoryStream ResetImg(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);
MemoryStream ms2 = new MemoryStream();
bmPhoto.Save(ms2, System.Drawing.Imaging.ImageFormat.Jpeg);
imgPhoto.Dispose();
gbmPhoto.Dispose();
bmPhoto.Dispose();
return ms2;
}
当然对于不同的需求可能要生成的效果也不一样,但只要能灵活运用对于一般的需求基本都能实现了。
如果需要保存图片到服务器,那么可以用下面的方法保存图片:
bmPhoto.Save(文件物理路径, System.Drawing.Imaging.ImageFormat.Jpeg);
【IHttpHandler】
程序通过ashx文件用IHttpHandler发送切割生成的图片,参考使用.ashx文件处理IHttpHandler实现发送文本及二进制数据的方法:
“利用.ashx文件是一个更好的方法,这个文件类似于.aspx文件,可以通过它来调用HttpHandler类,从而免去了普通.aspx页面的控件解析以及页面处理的过程。这个文件特别适合于生成动态图片,生成动态文本等内容。”
最后设置数据输出类型context.Response.ContentType,并使用context.Response.OutputStream向客户端输出图片数据:
context.Response.ContentType = "image/jpeg";
ResetImg(System.Web.HttpContext.Current.Server.MapPath(Pic), PicWidth, PicHeight, PointX, PointY, CutWidth, CutHeight).WriteTo(context.Response.OutputStream);
这个输出数据的方法适合用在不需要回发的数据输出中,例如ajax、动态图片等,关于这方面更详细的内容请看IHttpHandler接口。
下面是完整服务器端代码:
Code
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><%@ WebHandler Language="c#" Class="ImgCropper_WebHandler" Debug="true" %>
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(System.Web.HttpContext.Current.Server.MapPath(Pic), PicWidth, PicHeight, PointX, PointY, CutWidth, CutHeight).WriteTo(context.Response.OutputStream);
}
public MemoryStream ResetImg(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);
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;
}
}
}
各位有什么建议或意见欢迎留言讨论,由于涉及后台操作,请下载完整实例测试。
下载完整测试实例(.net版本)
下载完整测试实例(asp版本)
ps:实例中没有加入图片,测试时请自己插入一张图片(默认是1.jpg)。
ps2:应要求把asp版本加上了,但需要支持aspjpeg组件。
分享到:
相关推荐
【在线图片切割系统】是一种基于Web的图像处理技术,它允许用户通过网页界面对上传的图片进行裁剪、调整大小等操作,以满足特定的设计需求。这种系统通常包含多个核心功能,如选择区域、自由裁剪、比例裁剪、旋转、...
【标题】:“js + .Net 图片切割系统”是一个基于JavaScript和.NET技术的图像处理解决方案,主要用于实现对图片的局部裁剪和操作。这个系统结合了前端JavaScript的灵活性与后端.NET的强大处理能力,为用户提供了一种...
【图片切割系统(.net)】是一个基于ASP.NET技术开发的图像处理应用,主要功能是将整张图片分割成多个部分。这个系统对于那些需要在网页上展示大图或者需要进行图片精细化管理的开发者来说,非常实用。下面我们将深入...
【在线图片切割系统 ASP】是一种基于ASP(Active Server Pages)技术构建的应用,它允许用户通过网页界面对上传的图片进行裁剪操作。该系统的核心功能是提供一个交互式的图像处理平台,用户无需专业的图像编辑软件...
【在线图片切割系统 asp】是一个基于ASP(Active Server Pages)技术实现的简单图片处理工具,主要用于单张或批量切割图片。这个系统的核心功能是让用户能够根据需要调整裁剪区域,从而得到想要的部分图像,同时可能...
《JS + .Net 图片切割系统与在线截图详解》 在现代互联网应用中,图片处理是一项不可或缺的功能,尤其是在用户交互和图像编辑方面。本篇将深入探讨一个基于JS(JavaScript)和.Net技术实现的图片切割系统,以及其...
【标题】:“图片切割系统 asp.net版本”指的是一个基于ASP.NET技术开发的用于处理图像的应用程序,其核心功能是允许用户对图片进行自由切割,并将裁剪后的图像保存为新的图片文件。这个系统通常应用于需要自定义...
在线图片切割系统是一种网页应用,允许用户通过浏览器上传图片,并在服务器端对其进行剪裁处理,以获取所需的部分。这样的系统通常包含以下几个关键组件: 1. **用户界面**:提供一个简洁直观的界面,让用户上传...
【ASP源码—在线图片切割系统.zip】是一个包含ASP源代码的压缩文件,主要用于实现一个在线的图片处理功能,特别是图片切割。这个系统允许用户通过Web界面上传图片,并按照预设或自定义的尺寸进行切割,以满足网页...
这个在线图片切割系统的源码是基于ASP技术实现的,它提供了用户友好的界面和功能,允许用户上传图片并对其进行切割,以满足特定尺寸或布局的需求。下面将详细介绍ASP技术和在线图片切割系统的实现原理及可能涉及的...
在线图片切割系统是一种基于Web的图像处理工具,它允许用户通过浏览器对图片进行裁剪、调整大小等操作,而无需安装任何桌面软件。这个系统的关键在于实现用户友好的交互界面和高效的图像处理算法。在提供的文件列表...
要说明的是这个只是一个效果,并不是真正的切割图片,要获取真正的切割图片请参考图片切割系统。 先看看效果: 图片地址: 程序说明 这个效果主要分三个部分:层的拖放、层的缩放、图片切割(包括预览)...
图片切割(裁剪)系统 作者声明: 首先js是不能操作客户端文件的(除非特殊情况),所以图片的切割必须在后台处理,对于客户端的图片可以先上传再切割或者把图片和切割参数一起传递到服务器再处理(上传文件不在本次...
"C#实现图片切割的方法" 本文主要介绍了C#实现图片切割的方法,涉及C#使用Graphics实现图片属性的相关设置、保存等操作技巧。通过本文,我们可以了解到图片切割的基本概念、GDI+类库的使用、Graphics类的应用、图片...
在IT领域,图片处理是一项常见的任务,而图片切割则是其中的一种关键操作。本文将深入探讨如何使用Matlab来实现图片切割功能,以及如何通过提供的.exe文件进行操作。 首先,让我们理解图片切割的基本概念。图片切割...
JavaScript图片切割技术是一种在网页上实现动态图像裁剪的功能,常用于用户自定义头像、产品图片编辑等场景。这项技术结合了HTML、CSS和JavaScript,使得用户可以在浏览器端通过交互方式选择并调整图片的裁剪区域。...
《图片切割工具详解——基于Qt技术的实现》 在日常的图像处理工作中,有时我们需要将一张大图分割成若干小图,以便于管理和使用。这时,一款高效的图片切割工具就显得尤为重要。本文将深入探讨一个名为“图片切割...
以下是一个使用GD库进行图片切割的基本步骤: 1. **加载图片**:使用`imagecreatefromjpeg`(JPEG格式)、`imagecreatefrompng`(PNG格式)或`imagecreatefromgif`(GIF格式)函数加载图片。 2. **定义切割参数**...