自定義截取圖片

来源:http://www.cnblogs.com/fei-yu/archive/2016/10/13/5958087.html
-Advertisement-
Play Games

當初說這個需求的時候,在網上找了一點資料,但是基本上感覺不符合項目中的需求。參照一些項目,和同事的改造,終於是像點樣子了 截圖大致截為3個像素,每個像素使用的地方也不同,考慮圖片不會是很多,分別壓縮保存下來。 根據截取的像素位置,對應的壓縮成相應的圖片: 首先需要下載Jcrop.js與uploadi ...


 

  當初說這個需求的時候,在網上找了一點資料,但是基本上感覺不符合項目中的需求。參照一些項目,和同事的改造,終於是像點樣子了

截圖大致截為3個像素,每個像素使用的地方也不同,考慮圖片不會是很多,分別壓縮保存下來。 

  根據截取的像素位置,對應的壓縮成相應的圖片:

 

首先需要下載Jcrop.js與uploadify.js 上傳圖片的插件和截圖的插件

前臺頁面

 

<script src="~/Scripts/uploadify/jquery.uploadify-3.1.min.js"></script>
<script src="~/Scripts/Jcrop/jquery.Jcrop.min.js"></script>
<script src="~/Scripts/Comm_UploadJcrop.js"></script>
<script type="text/javascript">
    $(document).ready(function () {
        //上傳圖片
        UploadImg("file_uploadImg", false, "LoadJcropImage",true);
        //載入當前頭像
        var currentHeader= $("#hf_CurrentUserHeader").val();
        if (currentHeader.length > 0 && currentHeader != "/Images/defaultHeader.png")
            SetJcropImage(currentHeader.replace(/_JQ/,"_YS"));
    })
    function LoadJcropImage (file, data, response) {
        var url = eval("(" + data + ")");
        SetJcropImage(url);
    }
</script>
<div class="DivContainer">
    <input type="hidden" value="@ViewBag.CurrentHeader" id="hf_CurrentUserHeader" />
    <input type="file" name="file_uploadImg" id="file_uploadImg" />
    <div class="DataNormalTable_SpanTip div_NoFileTip">請先上傳圖片</div>
    <div class="UploadImgContainer" style="display:none;">
        <table cellpadding="0" cellspacing="0">
            <tr>
                <td rowspan="2" valign="middle" align="center" class="MainLargeTd">
                    <div class="DivContainer">
                        <img id="preview_large" alt="500 X 500" />
                    </div>
                </td>
                <td align="center" height="160">
                    <div class="Header_Img headBoxStyle" style="overflow:hidden;">
                        <img id="preview_large3" style="width:100%; height:100%;" />
                    </div>

                </td>
            </tr>
            <tr>
                <td valign="top" align="center">
                    <div class="BigHeader_Img headBoxStyle" style="overflow:hidden;">
                        <img id="preview_large2" style="width:100%; height:100%;" />
                    </div>

                </td>
            </tr>
        </table>
        <div id="crop_operation">
            <input type="hidden" name="x" id="x">
            <input type="hidden" name="y" id="y">
            <input type="hidden" name="w" id="w">
            <input type="hidden" name="h" id="h">
            <input type="hidden" name="imgsrc" id="imgsrc">
        </div>

    </div>
</div>
前臺界面

 需要引用對應的js

 

Comm_UploadJcrop.js

//剪裁頭像對象和寬高比例
var jcrop_api, boundx, boundy;
//上傳圖片 
//Id:上傳控制項Id
//IsShowProgress:是否需要展示進度條
//SuccessFunc: 上傳成功執行的方法
function UploadImg(Id, IsShowProgress, SuccessFunc,IsJcrop) {
    var uploadObj = $("#" + Id);
    var htmlstr = "<div class='upload_ShowFileProgress' id='" + Id + "-queue' " + (IsShowProgress ? "" : "style='display:none;'") + "></div>";
    uploadObj.parent().append(htmlstr);
    var img_UploadUrl = IsJcrop ? "/Upload/UploadifyHeader" : "/Upload/UploadifyImg"; //Upload控制器中方法
    uploadObj.uploadify({
        //指定swf文件
        'swf': '/Scripts/uploadify/uploadify.swf',//下載uploadify插件中的uploadify.swf
        //後臺處理的頁面
        'uploader': img_UploadUrl,
        //進度條id
        'queueID': Id + "-queue",
        //進度條顯示完成後是否自動消失
        'removeCompleted': false,
        //按鈕相關
        'buttonClass': 'btn_Upload',
        'buttonText': '請選擇圖片',
        'height': '31',
        'width': '108',
        //在瀏覽視窗底部的文件類型下拉菜單中顯示的文本
        'fileTypeDesc': 'Image Files',
        //允許上傳的文件尾碼
        'fileTypeExts': '*.gif; *.jpg; *.png; *.bmp; *.jpeg; *.svg',
        //選擇文件後自動上傳
        'auto': true,
        //設置為true將允許多文件上傳
        'multi': false,
        'onUploadSuccess': function (file, data, response) {
            if (SuccessFunc != undefined && SuccessFunc != null && SuccessFunc.length > 0) {
                eval(SuccessFunc + "(file,data,response)");
            }
        }
    });
}
//上傳文件
//Id:上傳控制項Id
//IsShowProgress:是否需要展示進度條
//SuccessFunc: 上傳成功執行的方法
function UploadFile(Id, IsShowProgress, SuccessFunc) {
    var uploadObj = $("#" + Id);
    var htmlstr = "<div class='upload_ShowFileProgress' id='" + Id + "-queue' " + (IsShowProgress ? "" : "style='display:none;'") + "></div>";
    uploadObj.parent().append(htmlstr);
    uploadObj.uploadify({
        //指定swf文件
        'swf': '/Scripts/uploadify/uploadify.swf',
        //後臺處理的頁面
        'uploader': '/Upload/Uploadify',
        //進度條id
        'queueID': Id + "-queue",
        //進度條顯示完成後是否自動消失
        'removeCompleted': false,
        //按鈕相關
        'buttonClass': 'btn_Upload',
        'buttonText': '請選擇文件',
        'height': '31',
        'width': '108',
        //上傳文件的類型  預設為所有文件
        'All Files': '*.*',
        //在瀏覽視窗底部的文件類型下拉菜單中顯示的文本
        //'fileTypeDesc': 'Image Files',
        //允許上傳的文件尾碼
        'fileTypeExts': '*.*',
        //選擇文件後自動上傳
        'auto': false,
        //設置為true將允許多文件上傳
        'multi': true,
        'onUploadSuccess': function (file, data, response) {
            if (SuccessFunc != undefined && SuccessFunc != null && SuccessFunc.length > 0) {
                eval(SuccessFunc + "(file,data,response)");
            }
        }
    });
}
//設定圖片
function SetJcropImage(url) {
    $(".div_NoFileTip").hide();
    $(".UploadImgContainer").show();
    $("#preview_large").attr("src", url);
    $("#preview_large2").attr("src", url);
    $("#preview_large3").attr("src", url);
    $("#imgsrc").val(url);
    ErealizeJcrop(url);
}
//剪切圖片
function ErealizeJcrop(url) {
    var $pcnt = $('#preview_large2').parent(),
      xsize = $pcnt.width(),
      ysize = $pcnt.height();
    $('#preview_large').Jcrop({
        onChange: updatePreview,
        onSelect: updatePreview,
        onSelect: updateCoords,
        aspectRatio: xsize / ysize
    }, function () {
        var bounds = this.getBounds();
        boundx = bounds[0];
        boundy = bounds[1];
        jcrop_api = this;
        // $preview.appendTo(jcrop_api.ui.holder);
    });
    //更換圖片時重新載入圖片
    if (jcrop_api != undefined)
        jcrop_api.setImage(url);
    function updateCoords(c) {
        $('#x').val(c.x);
        $('#y').val(c.y);
        $('#w').val(c.w);
        $('#h').val(c.h);
    };
    function updatePreview(c) {
        if (parseInt(c.w) > 0) {
            var rx = xsize / c.w;
            var ry = ysize / c.h;

            $("#preview_large2").css({
                width: Math.round(rx * boundx) + 'px',
                height: Math.round(ry * boundy) + 'px',
                marginLeft: '-' + Math.round(rx * c.x) + 'px',
                marginTop: '-' + Math.round(ry * c.y) + 'px'
            });

            $pcnt = $('#preview_large3').parent(),
            xsize2 = $pcnt.height();
            ysize2 = $pcnt.height();
            var rx2 = xsize2 / c.w;
            var ry2 = ysize2 / c.h;

            $("#preview_large3").css({
                width: Math.round(rx2 * boundx) + 'px',
                height: Math.round(ry2 * boundy) + 'px',
                marginLeft: '-' + Math.round(rx2 * c.x) + 'px',
                marginTop: '-' + Math.round(ry2 * c.y) + 'px'
            });

        }
    };

 

 

後臺代碼:

 

        #region 判斷文件夾是否存在,不存在則創建,返迴文件夾路徑
        private void CheckFileExistsCreateNew(string filepath)
        {
            if (!Directory.Exists(Server.MapPath(filepath)))
            {
                Directory.CreateDirectory(Server.MapPath(filepath));//創建文件夾
            }
        }
        #endregion

        #region 上傳圖片

        //上傳頭像
        [HttpPost]
        public JsonResult UploadifyHeader(HttpPostedFileBase fileData)
        {
            if (fileData != null)
            {
                try
                {
                    // 文件上傳後的保存路徑

                    string fileName = Path.GetFileName(fileData.FileName);// 原始文件名稱
                    string fileExtension = Path.GetExtension(fileName); // 文件擴展名
                    string saveName =DateTime.Now.ToString("yyyyMMddHHmmssffff")+"_Y" + fileExtension; // 保存文件名稱  
                    string Url = "/Upload/" + CurrentUserInfo.Sys_RentCompany.CompanyKey + "/" + CurrentUserInfo.Comm_User.Id + "/UploadImg";  //在項目中創建一個Upload文件夾存放上傳和截取的圖片   CurrentUserInfo.Sys_RentCompany.CompanyKey 為session 保存的值 這裡對應的文件夾的路徑 自己可以定義
                    string ShowUrl = Url + "/" + saveName;
                    string filePhysicalPath = Server.MapPath(ShowUrl);
                    //當前登陸人文件夾
                    CheckFileExistsCreateNew(Url);

                    fileData.SaveAs(filePhysicalPath);

                    //壓縮圖片
                    string YsFileImg = ImgHandler.YsImg(ShowUrl, filePhysicalPath);

                    return Json(YsFileImg);
                }
                catch (Exception ex)
                {
                    return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
                }
            }
            else
            {
                return Json(new { Success = false, Message = "請選擇要上傳的文件!" }, JsonRequestBehavior.AllowGet);
            }
        }

        //上傳頭像
        [HttpPost]
        public JsonResult UploadifyImg(HttpPostedFileBase fileData)
        {
            if (fileData != null)
            {
                try
                {
                    // 文件上傳後的保存路徑

                    string fileName = Path.GetFileName(fileData.FileName);// 原始文件名稱
                    string fileExtension = Path.GetExtension(fileName); // 文件擴展名
                    string saveName = DateTime.Now.ToString("yyyyMMddHHmmssffff") + "_Y" + fileExtension; // 保存文件名稱  
                    //string filed = "/Upload/" + saveName;//路經
                    string Url = "/Upload/" + CurrentUserInfo.Sys_RentCompany.CompanyKey + "/" + CurrentUserInfo.Comm_User.Id + "/UploadImg";
                    string ShowUrl = Url + "/" + saveName;
                    string filePhysicalPath = Server.MapPath(ShowUrl);
                    //當前登陸人文件夾
                    CheckFileExistsCreateNew(Url);

                    fileData.SaveAs(filePhysicalPath);

                    return Json(ShowUrl);
                }
                catch (Exception ex)
                {
                    return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
                }
            }
            else
            {
                return Json(new { Success = false, Message = "請選擇要上傳的文件!" }, JsonRequestBehavior.AllowGet);
            }
        }

        //保存剪切的圖片
        [HttpPost]
        public JsonResult JcropImg(FormCollection colls)
        {
            JsonFormatResult result = new JsonFormatResult { IsSuccess = true, Message = "保存成功!" };
            try
            {
                int x = int.Parse(colls["x"]);
                int y = int.Parse(colls["y"]);
                int w = int.Parse(colls["w"]);
                int h = int.Parse(colls["h"]);
                string imgsrc = colls["imgsrc"];
                string Path = ImgHandler.CutAvatar(imgsrc, x, y, w, h);
                result.Data = Path;
            }
            catch (Exception e)
            {
                result.IsSuccess = false;
                result.Message = e.Message;
            }
            return Json(result);
        } 
        #endregion

 

 照搬的代碼肯定會有缺陷,可以根據需求修改成適合的項目

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • c# .Net :Excel NPOI導入導出操作教程之讀取Excel文件信息及輸出 ...
  • 上一章中筆者對C#一些獨有的語法點進行講解,相信也可以看C#的一些神奇之處。那麼本章主要是放在多線程這方面的知識。不管是C#還是JAVA在開發過程或多或少都會用到關於多線程的編程。當然筆者不可能把多線程的知識點講的很全面。筆者這裡只是講一些筆者常用到的。如果有興趣的朋友,筆者希望主動性去查找一下資料 ...
  • 將bin的只讀屬性去掉,就OK。 ...
  • 主要技術: log4net-生成日誌。 ActiveMQ-生成日誌的時候發送消息,並實時監控日誌。 SignalR-將ActiveMQ監控的日誌實時顯示到瀏覽器上,而不用刷新瀏覽器。 小實例介紹: 左側命名為系統一,右側命名為系統二 系統一是生成日誌的小工具,系統二根據生成的日誌實時顯示數據,如果E ...
  • 代碼: <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> //ASP.NET中使用UpdatePanel實現局部非同步刷新 <asp:UpdatePanel ID="UpdatePanel1" run ...
  • NPOI 2.0+主要由SS, HPSF, DDF, HSSF, XWPF, XSSF, OpenXml4Net, OpenXmlFormats組成,具體列表如下: 資料來自:百度百科 NPOI.POIFS OLE2/ActiveX文檔屬性讀寫庫 NPOI.DDF 微軟Office Drawing讀 ...
  • 一:什麼是∧運算符: 二元 ^ 運算符是為整型和 bool 類型預定義的。對於整型,^ 將計算操作數的按位“異或”。對於 bool 操作數,^ 將計算操作數的邏輯“異或”;也就是說,當且僅當只有一個操作數為 true 時,結果才為 true。 二:在進行異或運算規則: 如兩個二進位數的相應位都為1 ...
  • 這兩天看到同事的一個小工具,用的是模塊式開發,也就是俗稱的插件開發,用的是反射+介面的方式實現的。感覺挺好的,也就學習了一下,寫個小Demo,在此記錄下。 一、寫介面類 介面類是所有模塊的基礎,因為讓主程式去尋找模塊,就是通過反射來找到繼承此介面的相關項目,也就是後期包含繼承此介面類的DLL文件。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...