下面是基于asp.net实现图片在线上传并在线裁剪功能的完整攻略:
1. 确定上传插件
为了实现在线上传图片,我们需要选择一个合适的上传插件。目前市场上比较流行的上传插件有uploadify和plupload,我们可以根据需求自行选择。
在这里,我以uploadify为例进行说明。
2. 实现图片上传
需先引入jquery、uploadify相关的js和css文件,然后在网页中加入一下代码:
<input type="file" name="file_upload" id="file_upload" />
再添加一下jquery脚本:
$(function() {
$('#file_upload').uploadify({
'swf' : '/uploadify/uploadify.swf',
'uploader' : '/upload.php'
});
});
其中,'swf'表示flash文件路径,'uploader'表示处理上传请求的服务器文件路径。在服务器中,需要将上传的文件保存到web服务器上的某个文件夹以便后续裁剪操作。例如,我们可以在服务器端使用ASP.NET语言编写一个叫做upload.aspx的文件来处理上传请求。
以下是upload.aspx代码:
protected void Page_Load(object sender, EventArgs e)
{
string path = Server.MapPath("~/upload/");//上传文件存储的路径
if (!System.IO.Directory.Exists(path))//判断是否需要创建目录
{
System.IO.Directory.CreateDirectory(path);
}
HttpFileCollection files = Request.Files;//获取上传文件列表
for (int i = 0; i < files.Count; i++)
{
HttpPostedFile file = files[i];
string fileName = System.IO.Path.GetFileName(file.FileName);
file.SaveAs(path + "/" + fileName);//保存文件到本地
}
}
至此,图片上传功能成功实现。
3. 实现图片裁剪
接下来,我们需要引用Jcrop库来实现图片裁剪功能。Jcrop是一款强大的图片裁剪插件,支持多种裁剪模式和裁剪尺寸。我们只需要在需要裁剪的图片上添加以下代码即可:
<img src="test.jpg" id="cropbox" />
然后,添加以下jquery脚本:
$(function() {
$('#cropbox').Jcrop({
aspectRatio: 1, //裁剪比例为1:1
onSelect: updateCoords //裁剪结束后会调用updateCoords函数
});
});
function updateCoords(c)
{
$('#x').val(c.x);
$('#y').val(c.y);
$('#w').val(c.w);
$('#h').val(c.h);//更新表单中的数据
$('#thumb').css({
width: Math.round(100/c.w*$('#cropbox').width()) + 'px',
height: Math.round(100/c.h*$('#cropbox').height()) + 'px',
marginLeft: '-' + Math.round(100/c.w*c.x) + 'px',
marginTop: '-' + Math.round(100/c.h*c.y) + 'px'//设置预览窗口中图片的尺寸和位置
});
}
以上代码实现了裁剪框的生成,当用户选中裁剪区域后,会自动调用updateCoords函数,更新预览窗口中图片的尺寸和位置。
裁剪后,我们还需要通过服务器端将裁剪后的图片保存到本地。
以下是处理裁剪请求的代码:
protected void Page_Load(object sender, EventArgs e)
{
int x = int.Parse(Request.Params["x"]);//获取裁剪区域的坐标和宽高尺寸
int y = int.Parse(Request.Params["y"]);
int w = int.Parse(Request.Params["w"]);
int h = int.Parse(Request.Params["h"]);
string imgPath = Server.MapPath("~/upload/test.jpg");//原始图片路径,从web.config文件中读取更佳
string savePath = Server.MapPath("~/upload/thumb.jpg");//裁剪后保存的路径,从web.config文件中读取更佳
FileStream fileStream = new FileStream(imgPath, FileMode.Open);//打开原始图片
Image img = Image.FromStream(fileStream);//读取图片
Bitmap bitmap = new Bitmap(w, h);//创建裁剪后保存的位图对象
Graphics graphics = Graphics.FromImage(bitmap);//创建Graphics对象,用于绘制新图片
graphics.DrawImage(img, new Rectangle(0, 0, w, h), new Rectangle(x, y, w, h), GraphicsUnit.Pixel);//绘制裁剪后新图片
Bitmap result = new Bitmap(bitmap);//创建最终保存的位图对象
result.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);//保存图片
fileStream.Dispose();//释放资源
img.Dispose();
bitmap.Dispose();
graphics.Dispose();
result.Dispose();
}
至此,基于asp.net实现图片在线上传并在线裁剪功能的完整攻略就结束了。
示例说明
示例一
用户要上传一张图片到服务器,并将其裁剪成400*400的正方形。
<input type="file" name="file_upload" id="file_upload" />
<img src="" width="400" height="400" id="thumb" />
$(function() {
$('#file_upload').uploadify({
'swf' : '/uploadify/uploadify.swf',
'uploader' : '/upload.aspx',
'onUploadComplete' : function(file) {
$.ajax({
url: '/crop.aspx',
data: {
x: $('#x').val(),
y: $('#y').val(),
w: $('#w').val(),
h: $('#h').val()
},
success: function() {
$('#thumb').attr('src', '/upload/thumb.jpg');//上传完成后,裁剪图片并刷新预览窗口
}
});
}
});
$('#cropbox').Jcrop({
aspectRatio: 1,
onSelect: updateCoords
});
function updateCoords(c)
{
$('#x').val(c.x);
$('#y').val(c.y);
$('#w').val(c.w);
$('#h').val(c.h);
$('#thumb').css({
width: Math.round(100/c.w*$('#cropbox').width()) + 'px',
height: Math.round(100/c.h*$('#cropbox').height()) + 'px',
marginLeft: '-' + Math.round(100/c.w*c.x) + 'px',
marginTop: '-' + Math.round(100/c.h*c.y) + 'px'
});
}
});
protected void Page_Load(object sender, EventArgs e)
{
string path = Server.MapPath("~/upload/");
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
HttpFileCollection files = Request.Files;
for (int i = 0; i < files.Count; i++)
{
HttpPostedFile file = files[i];
string fileName = System.IO.Path.GetFileName(file.FileName);
file.SaveAs(path + "/" + fileName);
}
}
protected void Page_Load(object sender, EventArgs e)
{
int x = int.Parse(Request.Params["x"]);
int y = int.Parse(Request.Params["y"]);
int w = int.Parse(Request.Params["w"]);
int h = int.Parse(Request.Params["h"]);
string imgPath = Server.MapPath("~/upload/test.jpg");
string savePath = Server.MapPath("~/upload/thumb.jpg");
FileStream fileStream = new FileStream(imgPath, FileMode.Open);
Image img = Image.FromStream(fileStream);
Bitmap bitmap = new Bitmap(w, h);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.DrawImage(img, new Rectangle(0, 0, w, h), new Rectangle(x, y, w, h), GraphicsUnit.Pixel);
Bitmap result = new Bitmap(bitmap);
result.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
fileStream.Dispose();
img.Dispose();
bitmap.Dispose();
graphics.Dispose();
result.Dispose();
}
示例二
用户要上传多张图片到服务器,并将其裁剪成200*200的正方形。
<input type="file" name="file_upload" id="file_upload" multiple="multiple" />
<ul id="thumbnails">
</ul>
$(function() {
$('#file_upload').uploadify({
'swf' : '/uploadify/uploadify.swf',
'uploader' : '/upload.aspx',
'onUploadComplete' : function(file) {
//上传完成后,按照顺序自动裁剪并刷新预览窗口
$('#thumbnails').find('img').each(function(index) {
var thumb = $(this);
$.ajax({
url: '/crop.aspx',
data: {
x: thumb.data('x'),
y: thumb.data('y'),
w: thumb.data('w'),
h: thumb.data('h')
},
success: function() {
thumb.attr('src', '/upload/thumb' + index + '.jpg');
}
});
});
}
});
$('#cropbox').Jcrop({
aspectRatio: 1,
onSelect: updateCoords
});
function updateCoords(c)
{
var thumb = $('<img>').attr({
src: $('#cropbox').attr('src'),
width: 200,
height: 200
}).data({
x: c.x,
y: c.y,
w: c.w,
h: c.h
}).appendTo('#thumbnails');//在预览窗口中显示裁剪后的图片
}
});
protected void Page_Load(object sender, EventArgs e)
{
string path = Server.MapPath("~/upload/");
if (!System.IO.Directory.Exists(path))
{
System.IO.Directory.CreateDirectory(path);
}
HttpFileCollection files = Request.Files;
for (int i = 0; i < files.Count; i++)
{
HttpPostedFile file = files[i];
string fileName = System.IO.Path.GetFileName(file.FileName);
file.SaveAs(path + "/" + fileName);
}
}
protected void Page_Load(object sender, EventArgs e)
{
int x = int.Parse(Request.Params["x"]);
int y = int.Parse(Request.Params["y"]);
int w = int.Parse(Request.Params["w"]);
int h = int.Parse(Request.Params["h"]);
string imgPath = Server.MapPath("~/upload/test" + Request.Params["index"] + ".jpg");//index为图片编号,从0开始
string savePath = Server.MapPath("~/upload/thumb" + Request.Params["index"] + ".jpg");
FileStream fileStream = new FileStream(imgPath, FileMode.Open);
Image img = Image.FromStream(fileStream);
Bitmap bitmap = new Bitmap(w, h);
Graphics graphics = Graphics.FromImage(bitmap);
graphics.DrawImage(img, new Rectangle(0, 0, w, h), new Rectangle(x, y, w, h), GraphicsUnit.Pixel);
Bitmap result = new Bitmap(bitmap);
result.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);
fileStream.Dispose();
img.Dispose();
bitmap.Dispose();
graphics.Dispose();
result.Dispose();
}
在示例二中,预览窗口会按照顺序显示上传的多张图片的缩略图,并自动裁剪成200*200的正方形。裁剪操作结束后,会自动刷新预览窗口中的缩略图。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:基于asp.net实现图片在线上传并在线裁剪功能 - Python技术站