上傳頭像並裁剪

来源:https://www.cnblogs.com/zhyue93/archive/2018/03/21/cutimg.html
-Advertisement-
Play Games

界面一: <link href="../theme/js/layui.layim/src/css/layui.css" rel="stylesheet"/> <style> #form1 { padding: 10px; } .usericon { margin-left: 0; } </style ...


界面一:

<link href="../theme/js/layui.layim/src/css/layui.css" rel="stylesheet"/>
<style>
    #form1 { padding: 10px; }
    .usericon { margin-left: 0; }
</style>

<form class="layui-form" id="form1" runat="server">
    <div class="layui-form-item">
        <div class="layui-inline">
            <label class="layui-form-label">上傳圖片</label>
            <div class="layui-input-block">
                <button id="btnUpload" class="layui-btn" type="button">上傳</button>
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-block usericon">
                <img id="imgShow" src="../theme/img/user.jpg" onerror="../theme/img/user.jpg" width="150" height="150" />
            </div>
        </div>
    </div>
</form>
頁面佈局代碼
<script src="../theme/js/layui.layim/src/layui.js"></script>
<script src="../theme/js/jquery.min.js"></script>
<script type="text/javascript">
    layui.use(['layer'], function () {
        //上傳
        $("#btnUpload").on("click", function () {
            layer.open({
                title: ['上傳', 'font-size:18px;'],
                area: ['700px', '550px'],
                fixed: false, //不固定
                maxmin: true,
                type: 2,
                content: "/test/PreviewImg.aspx"
            });
        });
    });
    function Update(src) {
        $("#imgShow").attr("src", src);
    }
</script>
加入js腳本-點擊上傳彈出頁面進行頭像上傳和截圖,完成後調用Update方法刷新頁面

界面二:

<link href="../theme/js/layui.layim/src/css/layui.css" rel="stylesheet" />
<link href="../theme/js/Jcrop/css/jquery.Jcrop.min.css" rel="stylesheet" />
<style>
    .container { margin-right: auto; margin-left: auto; *zoom: 1; }
        .container:before,
        .container:after { display: table; content: ""; line-height: 0; }
        .container:after { clear: both; }
    .row { *zoom: 1; }
        .row:before,
        .row:after { display: table; content: ""; line-height: 0; }
        .row:after { clear: both; }
    .span12 { margin-left: 10px; margin-right: 10px; }
    .span12 .layui-btn{margin-left:10px;}
    .jc-demo-box { text-align: left; margin: 2em auto; background: white; border: 1px #bbb solid; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.25); -moz-box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.25); box-shadow: 1px 1px 10px rgba(0, 0, 0, 0.25); padding: 1em 2em 2em; }
    form { margin: 1.5em 0; }
    .jcrop-holder #preview-pane { display: block; position: absolute; z-index: 2000; top: 10px; right: -280px; padding: 6px; border: 1px rgba(0,0,0,.4) solid; background-color: white; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); -moz-box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); box-shadow: 1px 1px 5px 2px rgba(0, 0, 0, 0.2); }
    #preview-pane .preview-container { width: 250px; height: 250px; overflow: hidden; }
</style>

<form id="form1" runat="server">
    <div class="container">
        <div class="row">
            <div class="span12">
                <div class="jc-demo-box">
                    <img src="../theme/img/user.jpg" id="target" alt="[Jcrop Example]" />
                    <div id="preview-pane">
                        <div class="preview-container">
                            <img src="../theme/img/user.jpg" class="jcrop-preview" alt="Preview" />
                        </div>
                    </div>
                </div>
                <button id="btnUpload" class="layui-btn" type="button">上傳</button>
                <button id="btnOk" class="layui-btn layui-btn-disabled" type="button">確定</button>
                <button id="btnX" class="layui-btn" type="button">0</button>
                <button id="btnY" class="layui-btn" type="button">0</button>
                <button id="btnW" class="layui-btn" type="button">0</button>
                <button id="btnH" class="layui-btn" type="button">0</button>
            </div>
        </div>
    </div>
    <asp:HiddenField ID="x1" runat="server" />
    <asp:HiddenField ID="y1" runat="server" />
    <asp:HiddenField ID="w" runat="server" />
    <asp:HiddenField ID="h" runat="server" />
</form>
頁面佈局代碼
<script src="../theme/js/jquery.min.js"></script>
<script src="../theme/js/Jcrop/js/jquery.Jcrop.min.js"></script>
<script src="../theme/js/layui.layim/src/layui.js"></script>
jQuery(function ($) {
    // Create variables (in this scope) to hold the API and image size
    var jcrop_api,
        boundx,
        boundy,
        // Grab some information about the preview pane
        $preview = $('#preview-pane'),
        $pcnt = $('#preview-pane .preview-container'),
        $pimg = $('#preview-pane .preview-container img'),
        xsize = $pcnt.width(),
        ysize = $pcnt.height();
    //console.log('init', [xsize, ysize]);
    $('#target').Jcrop({
        onChange: updatePreview,
        onSelect: updatePreview,
        aspectRatio: xsize / ysize
    }, function () {
        // Use the API to get the real image size
        var bounds = this.getBounds();
        boundx = bounds[0];
        boundy = bounds[1];
        // Store the API in the jcrop_api variable
        jcrop_api = this;
        // Move the preview into the jcrop container for css positioning
        $preview.appendTo(jcrop_api.ui.holder);
    });
    function updatePreview(c) {
        if (parseInt(c.w) > 0) {
            var rx = xsize / c.w;
            var ry = ysize / c.h;
            $pimg.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'
            });
        }
        $('#x1').val(c.x);//左頂點的x坐標
                $('#y1').val(c.y);//右頂點的x坐標
                $('#w').val(c.w);//截圖的寬度
                $('#h').val(c.h);//截圖的高度
        $('#btnX').html(c.x);//左頂點的x坐標
                $('#btnY').html(c.y);//右頂點的x坐標
                $('#btnW').html(c.w);//截圖的寬度
                $('#btnH').html(c.h);//截圖的高度
    };
});
js裁剪的腳本
//上傳文件
layui.use('upload', function () {
    var upload = layui.upload;
    //單個文件上傳
    var uploadInst = upload.render({
        elem: '#btnUpload' //綁定元素
      , url: '/test/ashx/ashx.ashx' //上傳介面
      , data: {
          action: "uploadimg"
          //, maxSize: $(".jcrop-holder>.jcrop-tracker").width()
      }
      , before: function (obj) {//在 choose 回調之後、done/error 回調之前觸發
          //layer.load(); //上傳loading
      }
      , done: function (res) {
          //上傳完畢回調
          $("#target").attr("src", res.data.src);
          $(".jcrop-holder>img").attr("src", res.data.src);
          $(".preview-container>img.jcrop-preview").attr("src", res.data.src);
          $(".jcrop-tracker").siblings("img").attr("src", res.data.src);
          //上傳圖片後-確定按鈕可用
          $("#btnOk").removeClass("layui-btn-disabled");
          
      }
      , error: function () {
          //請求異常回調
      }
    });
});
上傳文件
//確定
$("#btnOk").on("click", function () {
    if (!$(this).hasClass("layui-btn-disabled")) {
       var x= $('#x1').val();//左頂點的x坐標               
       var y = $('#y1').val();//右頂點的x坐標               
       var w = $('#w').val();//截圖的寬度               
       var h = $('#h').val();//截圖的高度
        $.ajax({
            //提交數據的類型 POST GET
            type: "POST",
            //提交的網址
            url: '/test/ashx/ashx.ashx',
            //提交的數據
            data: {
                action: "cutimg",
                x: x,
                y: y,
                w: w,
                h: h,
                src: $("#target").attr("src"),
                maxWidth: $(".jcrop-holder>.jcrop-tracker").width(),
                maxHeight: $(".jcrop-holder>.jcrop-tracker").height()
            },
            //返回數據的格式-"xml", "html", "script", "json", "jsonp", "text".
            datatype: "json",
            //成功返回之後調用的函數             
            success: function (data) {
                if (data.code == 0) {
                    parent.Update(data.src);
                    CloseThis();
                }
            },
            //調用出錯執行的函數
            error: function () {
                //請求出錯處理
            }
        });
    } 
});
//關閉當前iframe
function CloseThis() {
    //先得到當前iframe層的索引
    var index = parent.layer.getFrameIndex(window.name);
    parent.layer.close(index); //再執行關閉   
}
確定
/// <summary>
/// 上傳圖片(如果沒有傳入寬高,不壓縮圖片)
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
private string Uploadimg(HttpContext context)
{
    int maxSize = 0;//壓縮後的最大尺寸(長或高,單位px)
    int.TryParse(context.Request.Params["maxSize"], out maxSize);
    //圖片保存路徑
    string savePath = "/uploadfiles/test/" + DateTime.Now.ToString("yyyyMM") + "/";
    if (!Directory.Exists(context.Server.MapPath(savePath)))
    {
        Directory.CreateDirectory(context.Server.MapPath(savePath));
    }
    string fileName = Guid.NewGuid().ToString("N");
    HttpPostedFile file = context.Request.Files[0];//上傳的圖片
    if (file != null)
    {//上傳的圖片不為空
        string fileExt = Path.GetExtension(file.FileName);//文件擴展名
        fileName += fileExt;
        //壓縮後的圖片
        Bitmap img = FileExt.ImageZip(file.InputStream, fileExt, maxSize);
        if (img != null)
        {//壓縮後的圖片不為空
            img.Save(context.Server.MapPath(savePath + fileName));
        }
        else
        {//原圖片保存
            file.SaveAs(context.Server.MapPath(savePath + fileName));
        }
    }
    return "{\"code\":0,\"msg\":\"上傳成功\",\"data\":{\"src\":\"" + (savePath + fileName) + "\"}}";
}
執行後臺代碼-上傳文件
/// <summary>
/// 裁剪圖片-返回裁剪後的圖片地址
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
private string CutImg(HttpContext context)
{
    string src = context.Request.Params["src"];//原圖片地址
    Image file = Image.FromFile(context.Server.MapPath(src));//上傳的圖片
    int x = string.IsNullOrEmpty(context.Request.Params["x"]) ? 0 : int.Parse(context.Request.Params["x"]);//左頂點的x坐標
    int y = string.IsNullOrEmpty(context.Request.Params["y"]) ? 0 : int.Parse(context.Request.Params["y"]);//右頂點的x坐標
    int w = string.IsNullOrEmpty(context.Request.Params["w"]) ? 0 : int.Parse(context.Request.Params["w"]);//截圖的寬度
    int h = string.IsNullOrEmpty(context.Request.Params["h"]) ? 0 : int.Parse(context.Request.Params["h"]);//截圖的高度
    int maxWidth = string.IsNullOrEmpty(context.Request.Params["maxWidth"]) ? 0 : int.Parse(context.Request.Params["maxWidth"]);//最大寬
    int maxHeight = string.IsNullOrEmpty(context.Request.Params["maxHeight"]) ? 0 : int.Parse(context.Request.Params["maxHeight"]);//最大高
    
    string fileExt = Path.GetExtension(src);//圖片格式
    string fileName = Guid.NewGuid().ToString("N") + fileExt;
    string savePath = "/uploadfiles/test/" + DateTime.Now.ToString("yyyyMM") + "/" + fileName;
    
    CutImage(GetReducedImage(file, maxHeight, maxHeight), x, y, w, h, savePath, context);
    return "{\"code\":0,\"src\":\"" + savePath + "\"}";
}

/// <summary> 
/// 生成縮略圖重載方法1,返回縮略圖的Image對象 
/// </summary> 
/// <param name="Width">縮略圖的寬度</param> 
/// <param name="Height">縮略圖的高度</param> 
/// <returns>縮略圖的Image對象</returns> 
public Bitmap GetReducedImage(Image ResourceImage, int Width, int Height)
{
    try
    {
        //用指定的大小和格式初始化Bitmap類的新實例 
        Bitmap bitmap = new Bitmap(Width, Height, PixelFormat.Format32bppArgb);
        //從指定的Image對象創建新Graphics對象 
        Graphics graphics = Graphics.FromImage(bitmap);
        //清除整個繪圖面並以透明背景色填充 
        graphics.Clear(Color.Transparent);
        //在指定位置並且按指定大小繪製原圖片對象 
        graphics.DrawImage(ResourceImage, new Rectangle(0, 0, Width, Height));
        return bitmap;
    }
    catch (Exception e)
    {
        return null;
    }
}

/// <summary>
/// 截取圖片方法
/// </summary>
/// <param name="bitmap">原圖</param>
/// <param name="beginX">開始位置-X</param>
/// <param name="beginY">開始位置-Y</param>
/// <param name="width">截取寬度</param>
/// <param name="height">截取長度</param>
/// <param name="path">保存路徑</param>
/// <param name="context">上下文</param>
public static void CutImage(Bitmap bitmap, int beginX, int beginY, int width, int height, string path, HttpContext context)
{
    if (beginX + width > bitmap.Width)
        beginX = bitmap.Width - width;
    if (beginY + height > bitmap.Height)
        beginY = bitmap.Height - height;
    Bitmap destBitmap = new Bitmap(width, height);//目標圖 
    Rectangle destRect = new Rectangle(0, 0, width, height);//矩形容器 
    Rectangle srcRect = new Rectangle(beginX, beginY, width, height);
    Graphics g = Graphics.FromImage(destBitmap);
    g.DrawImage(bitmap, destRect, srcRect, GraphicsUnit.Pixel);
    destBitmap.Save(context.Server.MapPath(path), ImageFormat.Jpeg);
}
點擊確定-後臺進行截圖

 


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

-Advertisement-
Play Games
更多相關文章
  • 原文地址:http://www.2cto.com/kf/201202/121170.html 我們在做數據系統的時候,經常會用到模糊搜索,但是,資料庫提供的模糊搜索並不具備按照相關度進行排序的功能。 現在提供一個比較兩個字元串相似度的方法。通過計算出兩個字元串的相似度,就可以通過Linq在記憶體中對數 ...
  • 登錄功能實現起來有哪些常用的方式,大家首先想到的肯定是cookie或session或cookie+session,當然還有其他模式,今天主要探討一下在Asp.net core 2.0下實現以cookie登錄授權,與net freamwork框架下常用的開發方式有所不同的是以前開發不管是webform... ...
  • 概述 Toast Notification 在 UWP App 中有很重要的作用,能夠很大程度上增強 App 和用戶之間的溝通,比如運營推廣活動、版本更新、提醒類任務提示等等。Toast Notification 可以通過圖片、文字、按鈕等創建可適配、可交互的通知。 我們在 About Window ...
  • 多租戶技術或稱多重租賃技術,簡稱SaaS,是一種軟體架構技術,是實現如何在多用戶環境下共用相同的系統或程式組件,並且可確保各用戶間數據的隔離性。簡單講:在一臺伺服器上運行單個應用實例,它為多個租戶(客戶)提供服務。從定義中我們可以理解:多租戶是一種架構,目的是為了讓多用戶環境下使用同一套程式,且保證... ...
  • 第一步:安裝 安裝“System.Web.Optimization”:在中“NuGet”中搜索 安裝。 第二步:配置 配置“Views”目錄下的“web.config”文件增加“System.Web.Optimization”配置 第三部:寫代碼 在“App_Start”文件夾新建名叫“Bundle ...
  • 1. 前言 VisualTransition是控制項模板中的重要組成部分,無論是自定義控制項或者修改控制項樣式都會接觸到VisualTransition。明明這麼重要,博客園上好像都沒多少關於VisualTransition的主題。 2. 什麼是VisualTransition VisualTransit ...
  • 基於netcore實現mongodb和ElasticSearch之間的數據實時同步的工具 支持一對一,一對多,多對一和多對多的數據傳輸方式. 一對一 - 一個mongodb的collection對應一個elasticsearch的index之間的數據同步 一對多 - 一個mongodb的collec ...
  • .NET Core支持多種不同的緩存,其中包括MemoryCache,它表示存儲在Web伺服器記憶體中的緩存; 記憶體中的緩存存儲任何對象; 分散式緩存界面僅限於byte[] 1:在.net core中使用MemoryCache首先要下載MemoryCache包 在程式包管理器控制台輸入命令:Insta ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...