圖片裁剪大頭貼功能 - ASP.NET WebForm + jQuery + imgAreaSelect
系統操作環境:
- ASP.NET WebForm
- .NET Framework 4.0 (C#)
- jQuery 1.7.1
- imgAreaSelect 0.9.8
目錄結構:
與之前使用ASP.NET MVC的目錄結構相比,其實差異性不是很大,同樣的主要操作頁面都是有三個:
- Default 主頁面
- Upload 上傳頁
- Crop 裁剪圖片頁
前端頁面的程式設定與使用
Crop頁面:
<form id="form1" runat="server">
<div>
<asp:Button ID="Button1" runat="server" Text="回到首頁" onclick="Button1_Click" />
<asp:Button ID="Button2" runat="server" Text="裁剪相片" onclick="Button2_Click" />
<asp:Panel ID="Panel1" runat="server" Visible="false">
<asp:Image ID="Image3" runat="server" />
<hr />
</asp:Panel>
<div align="center">
<img id="Image1" runat="server" style="float: left; margin-right: 10px;" alt="Create Thumbnail" />
<div style="float: left; position: relative; overflow: hidden; width: 100px; height: 100px;">
<img id="Image2" runat="server" style="position: relative;" alt="Thumbnail Preview" />
</div>
</div>
<input type="hidden" id="x1" name="x1" value="" runat="server" />
<input type="hidden" id="y1" name="y1" value="" runat="server" />
<input type="Hidden" id="x2" name="x2" value="" runat="server" />
<input type="hidden" id="y2" name="y2" value="" runat="server" />
</div>
</form>
基本上頁面的elements設置都大同小異,與MVC的部份都是一樣的,差別就在於我所設計的這個WebForm頁面並不會有太多的AJAX功能與效果,私心而論,WebForm也是可以達成AJAX功能與效果,但與MVC相比就不是那樣靈活與自由,因為WebForm有太多需要與Server端元件牽扯在一起,而本人我比較不喜歡使用 AJAX.NET,UpdatePanel的使用要考慮到太多的問題,尤其是WebForm必須注意的網頁生命週期事件。
並不是說使用了UpdatePanel就無法jQuery做結合,而是為了要與jQuery來做整合就還要多花許多的時間與工夫,所以成本與效益的考量下,這個ASP.NET WebForm的裁剪圖面功能就完全不做AJAX的功能與效果,每一次的操作完成就會有一次的PostBack。
下圖為一張尚未進行裁剪操作的原始圖片資料
下圖為已經有操作過裁剪圖片的顯示
來看看Crop頁面的前端程式的內容:
<script type="text/javascript" src="Scripts/jquery-1.7.1.min.js"></script>
<script type="text/javascript" src="Scripts/jquery.imgareaselect.pack.js"></script>
<script type="text/javascript">
$(document).ready(function ()
{
$('img#Image1').imgAreaSelect(
{
handles: 'corners',
aspectRatio: '1:1',
x1: 0, y1: 0, x2: 100, y2: 100,
onSelectChange: preview
});
});
function preview(img, selection)
{
var scaleX = 100 / selection.width;
var scaleY = 100 / selection.height;
var img = new Image();
img.src = $('#Image1').attr('src');
var pic_real_width = img.width;
var pic_real_height = img.height;
$('#Image1 + div > img').css({
width: Math.round(scaleX * pic_real_width) + 'px',
height: Math.round(scaleY * pic_real_height) + 'px',
marginLeft: '-' + Math.round(scaleX * selection.x1) + 'px',
marginTop: '-' + Math.round(scaleY * selection.y1) + 'px'
});
$('input[name="x1"]').val(selection.x1);
$('input[name="y1"]').val(selection.y1);
$('input[name="x2"]').val(selection.x2);
$('input[name="y2"]').val(selection.y2);
}
</script>
這邊imgAreaSelect使用設定與ASP.NET MVC的使用設定是大致相同的,不過這邊要補充說明一下「handles」這個設定參數,
handles
當imgAreaSelect沒有設定這個參數時,預設為「false」也就是裁剪選取框不會出現這角落與各邊的小方框,當設定為「handles: ture」時,裁剪選取框的各個角落與四個邊中間就會出現小方框,而當設定為「handles: ‘corners’」時,只會在四個角落出現小方框,而四個邊中間則不會出現,如下圖所示,
後端:Code behind的內容
因為前面有說過這個WebForm的範例不會有AJAX的效果與功能,所以每一個完成送出的操作都是一個PostBack,所以當選取完裁剪區域後按下「裁剪圖片」Button就是整頁再PostBack回後端,
而我們是把選擇裁剪區域框的座標值一樣是存放到Hidden Field中,所以當頁面PostBack回到後端,後端程式也同樣是可以得到座標值,不過記得的就是要將Hidden Field增加「runat = “server”」(因為並非使用伺服器控制項的HiddenField),
看看後端裁剪圖片的程式:
#region -- SaveCropImage --
/// <summary>
/// Saves the crop image.
/// </summary>
private void SaveCropImage()
{
bool isNullOfsectionValue = this.x1.Value == null
&& this.x2.Value == null
&& this.y1.Value == null
&& this.y2.Value == null;
if (isNullOfsectionValue)
{
ClientScriptHelper.ShowMessage(this.Page, "請選擇相片裁剪區域", RegisterScriptType.Start);
}
else
{
CropImageUtility cropUtils = new CropImageUtility(this.UploadPath, this.OriginalPath, this.CropPath);
Dictionary<string, string> result = cropUtils.ProcessImageCrop
(
this.CurrentImage,
new int[]
{
this.x1.Value.ConvertToInt(),
this.x2.Value.ConvertToInt(),
this.y1.Value.ConvertToInt(),
this.y2.Value.ConvertToInt()
}
);
if (!result["result"].Equals("Success", StringComparison.OrdinalIgnoreCase))
{
ClientScriptHelper.ShowMessage(this.Page, result["msg"], RegisterScriptType.Start);
}
else
{
//裁剪圖片檔名儲存到資料庫
service.Update(this.ImageID, result["CropImage"]);
//如果有之前的裁剪圖片,則刪除
if (!string.IsNullOrWhiteSpace(result["OldCropImage"]))
{
cropUtils.DeleteCropImage(result["OldCropImage"]);
}
//載入裁剪圖片檔
LoadCropImage();
ClientScriptHelper.ShowMessage(this.Page, "相片裁剪完成", RegisterScriptType.Start);
}
}
}
#endregion
後端:圖片上傳的處理
為什麼特別提出說明這一段呢?
以往在WebFrom中對於頁面的檔案上傳欄位,在Code Behid的處理都是對應使用「HttpPostedFile」,但因為ASP.NET MVC對於檔案上傳欄位的處理所對應的是「HttpPostedFileBase」,
兩個類別的結構內容差不多,但兩者間是沒有關連性,除了同在一個Namespace「System.Web」下,
而在.NET Framework 3.5之後就有提供一個 HttpPostedFileWrapper 類別可以來幫助我們解決這個問題,
MSDN - HttpPostedFileWrapper 類別
「HttpPostedFileWrapper 類別衍生自 HttpPostedFileBase 類別,而且可做為 HttpPostedFile 類別的包裝函式。 這個類別會公開 (Expose) HttpPostedFile 類別的功能,同時也會公開 HttpPostedFileBase 型別。 HttpPostedFileBase 類別可讓您以自訂實作取代應用程式中 HttpPostedFile 類別的原始實作,例如當您從 ASP.NET 管線外部執行單元測試時。」
HttpPostedFileWrapper是繼承自HttpPostedFileBase,而其建構式為接受HttpPostedFile類別的參數,
public HttpPostedFileWrapper
(
HttpPostedFile httpPostedFile
)
因為我不希望兩個網站專案都各自造輪子,只要使用一個處理上傳檔案的Method就好了,所以WebForm對於這個地方就需要做點小小的處理,
直接看看程式的內容:
#region -- ProcessUpload --
/// <summary>
/// Processes the upload.
/// </summary>
private void ProcessUpload()
{
string fileName = string.Empty;
if (FileUpload1.HasFile)
{
HttpPostedFileBase uploadFile = new HttpPostedFileWrapper(FileUpload1.PostedFile);
CropImageUtility cropUtils = new CropImageUtility(this.UploadPath, this.OriginalPath, "");
Dictionary<string, string> result = cropUtils.ProcessUploadImage(uploadFile);
if (!result["result"].Equals("Success", StringComparison.OrdinalIgnoreCase))
{
Session["Upload_File"] = null;
ClientScriptHelper.ShowMessage(this.Page, result["msg"], RegisterScriptType.Start);
}
else
{
Session["Upload_File"] = result["msg"];
}
}
}
#endregion
操作流程示意
Step 1:首頁,列出所有圖片資料並可以做刪除資料的操作
Step 2:上傳圖片頁
選擇並上傳圖片,上傳圖片暫存至/Temp目錄下,當按下「儲存圖片」Button在將圖片移到/Original目錄下,如果按下「取消儲存」則將圖片自/Temp目錄中刪除,並清空頁面的資料以做重新上傳。
按下「儲存圖片」Button在將圖片移到/Original目錄下,並且顯示「裁剪圖片」Button,按下此Button就會移到裁剪圖片頁。
Step 3:裁剪圖片頁
新上傳或未進行過裁剪圖片操作的資料並不會有裁剪圖片的圖檔,
選擇裁剪圖片的區域,並在右方即時預覽
按下「裁剪圖片」Button後,頁面資料PostBack到後端進行圖片裁剪的操作,完成後就會顯示完成裁剪圖片的結果並顯示裁剪後的圖檔內容。
因為大部分的功能都與前一篇ASP.NET MVC架構的功能是雷同的,所以就沒有太多的內容描述, 除了特別提出的「HttpPostedFile」與「HttpPostedFileBase」的差異與如何使用「HttpPostedFileWrapper」將HttpPostedFile類別的物件轉換為HttpPostedFileBase類別的物件,而下一篇文章除了把使用imgAreaSelect的ASP.NET MVC網站與ASP.NET WebForm網站原始碼提出來之外,也會簡單說明一下如何將共用功能的部份給提取出來到另一個類別庫專案中,讓兩種不同架構的網站可以共用。
參考連結:
imgAreaSelect Documentation http://odyniec.net/projects/imgareaselect/usage.html
圖片裁剪大頭貼功能 - ASP.NET WebForm + jQuery + imgAreaSelect的更多相关文章
- Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化
Atitit 提升开发进度大方法--高频功能与步骤的优化 类似性能优化 1. 通用功能又可以组合成crud模块1 1.1. 查询(包括步骤,发送查询dsl,通讯返回结果,绑定到表格控件)2 1.2. ...
- 解析ASP.NET WebForm和Mvc开发的区别
因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...
- ASP.NET Webform和ASP.NET MVC的区别
ASP.NET WebForm ASP.NET Webform提供了一个类似于winform的事件响应GUI模型(event-driven GUI),隐藏了HTTP.HTML.JavaScript等细 ...
- asp.net webform设计思路的思考
我使用asp.net的webform框架进行web应用程序的开发已经差不多四年了,在整个开发生涯中,也使用过一年asp.net的mvc框架.因为网上经常有讨论webform框架和mvc框架的优劣,所以 ...
- 解析ASP.NET WebForm和Mvc开发的区别 分类: ASP.NET 2013-12-29 01:59 11738人阅读 评论(5) 收藏
因为以前主要是做WebFrom开发,对MVC开发并没有太深入的了解.自从来到创新工场的新团队后,用的技术都是自己以前没有接触过的,比如:MVC 和EF还有就是WCF,压力一直很大.在很多问题都是不清楚 ...
- int.TryParse非预期执行引发的思考 ASP.NET -- WebForm -- 给图片添加水印标记 Windows -- 使用批处理文件.bat删除旧文件
int.TryParse非预期执行引发的思考 问题出现 这天在写一个页面,想谨慎些就用了int.TryParse,结果出问题了. 代码如下: Copy int id = 1000; //Reque ...
- .net mvc 站点自带简易SSL加密传输 Word报告自动生成(例如 导出数据库结构) 微信小程序:动画(Animation) SignalR 设计理念(一) ASP.NET -- WebForm -- ViewState ASP.NET -- 一般处理程序ashx 常用到的一些js方法,记录一下 CryptoJS与C#AES加解密互转
.net mvc 站点自带简易SSL加密传输 因项目需要,传输数据需要加密,因此有了一些经验,现简易抽出来分享! 请求:前端cryptojs用rsa/aes 或 rsa/des加密,后端.net ...
- asp.net webform 打造私人后台管理系统(附源码)
系统简介 git地址:https://github.com/qingfengjun/XSSystem 不少人让我做公司的网站,要求不多,但是需要有一个后台系统,所以就有了开发的动力.也想做个系统自己学 ...
- 初步认识ASP.NET WebForm
C#可已进行以下两大类的开发 一.客户端应用程序C/S 主要有两种开发技术: 1.winForm windows窗体应用程序 2.WPF微软新一代图形框架 MFC(比较老的开发技术) MVVM(客户端 ...
随机推荐
- 如何在sharepoint里通过correlation id查找详细的错误信息
Sharepoint里我们经常遇到这样的错误信息: 我们能通过下面的power shell 命令来查到详细的错误信息: $correlationid = "943e6e9c-b5d9-207 ...
- LCA-倍增法(在线)O(nlogn)-O(logn)
1. DFS预处理出所有节点的深度和父节点 inline void dfs(int u) { int i; ;i=next[i]) { if (!deep[to[i]]) { deep[to[i]] ...
- ios控件 UIImageView
UIImageView的作用是显示图片和多张动态的图片 - (id)initWithImage:(UIImage *)image;//初始化图片视图 - (id)initWithImage:(UI ...
- jax-rs的客户端完整实例
本地接口: @Override public Response formsubGet(String accountContent, char inputContent, S ...
- Immutable 详解及 React 中实践
本文转自:https://github.com/camsong/blog/issues/3 Shared mutable state is the root of all evil(共享的可变状态是万 ...
- python 邮件报警
为了以后方便使用邮件报警 我这边直接写入一推报警模板 方便以后使用 加入模块 import smtplib from email.mime.text import MIMEText from emai ...
- 【转】How to build and install PHP 5.6.9 from source on Ubuntu 14.04 VPS
原文 https://vpsineu.com/blog/how-to-build-and-install-php-5-6-9-from-source-on-ubuntu-14-04-vps/ In t ...
- php秒杀
我们知道数据库处理sql是一条条处理的,假设购买商品的流程是这样的: sql1:查询商品库存 ? 1 2 3 4 5 if(库存数量 > 0) { //生成订单... sql2:库存-1 ...
- C++调用com控件方法
转载自:http://blog.csdn.net/haijun286972766/article/details/6273414 最近要求做一个C++调用com组件的DEMO.由于自己对C++并无研究 ...
- 函数求值一<找规律>
函数求值 题意: 定义函数g(n)为n最大的奇数因子.求f(n)=g(1)+g(2)+g(3)+-+g(n).1<=n<=10^8; 思路: 首先明白暴力没法过.问题是如何求解,二分.知道 ...