自定義截取圖片保存

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

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


 

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

截圖大致截為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
更多相關文章
  • ...
  • 80%的前500強企業就數據管理方面都有一個共性——管理規範,高效輔助流程。 但數據管理並不是一言即成,尤其是處於快速發展和轉型的企業。就數據系統而言,一旦系統增多,相應的數據問題也隨之而來。那麼如何統一有效地管理數據?實現數據可視化?這裡分享某百強集團搭建數據平臺的建設經驗。 ...
  • truncate table page_frame_mst; select setval('page_frame_mst_id_seq', 1, false); select setval('image_group_mst_id_seq', (select max(id) from image_gr ...
  • 最近接手些mysql資料庫維護,發現mysql在批量操作方面就是個渣渣啊,比起MS SQL SERVER簡直就是“不可同日而語”。 咨詢了下MySQL的高手,對於數據遷移這種問題,一種處理方式就是直接“一步到位” ,一次性將所有數據查詢插入到另外一個表,然後再刪除原表數據;另外一種處理方式就是使用p ...
  • 最近做項目在部署到阿裡雲伺服器上之後出現了兩個問題: 1、亂碼問題。 2、ajax的php處理頁面裡面利用json_encode()函數返回json數據,則資料庫返回的數據只能是UTF8,如果是gbk則json也無法返回。 發現是資料庫編碼格式問題,網站使用的編碼格式為UTF8,資料庫的編碼格式調為 ...
  • 下麵,主要是驗證在MySQL主從複製環境下,存儲過程,函數,觸發器,事件的複製情況,這些確實會讓人混淆。 首先,創建一張測試表 存儲過程 創建存儲過程 通過查看二進位日誌,可以看到該DDL語句已被記錄 執行存儲過程 查看二進位日誌中,記錄的是還是call p1('tom',10)操作記錄對應的SQL ...
  • 1.出錯結果:資料庫表視圖有多條數據,在使用EF框架進行查詢時卻只得到一條數據(註:攔截EF得到的sql語句在資料庫進行查詢並沒有任務問題)。 2.出錯原因:該視圖中沒有ID或者主鍵,EF查詢時進行反射預設都是同一條數據。 3.總結:EF框架查詢視圖時需要註意加入ID或者主鍵 以上僅是個人簡單分析。 ...
  • 求迷宮從入口到出口的所有路徑是一個經典的程式設計問題,求解迷宮,通常採用的是“窮舉+回溯”的思想,即從入口開始,順著某一個方向出發,若能夠走通,就繼續往前走;若不能走通,則退回原路,換一個方向繼續向前探索,直到所有的通路都探尋為止。因此本文依據這種“窮舉+回溯”的思想,設計一個求解迷宮的程式。 1 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...