最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用cropper.js裁剪頭像的實例代碼

 更新時間:2017年09月29日 15:04:03   作者:劍火6  
最近小編在做一個裁剪頭像的功能,下面小編把使用cropper.js裁剪頭像的實例代碼分享到腳本之家平臺,需要朋友參考下吧

最近項目需要頭像裁剪的功能,在網(wǎng)上找了一下,發(fā)現(xiàn)了github上的cropper項目還不錯,借鑒了一下。。用起來挺簡單的,下面是我做的一個小例子:

開始先放個成品圖:

下面給出前后端的代碼

前端頁面是一個單獨(dú)的jsp頁面,用來做彈出層來裁剪圖片比較好。

關(guān)于jsp頁面引用的兩個關(guān)于cropper的 文件,我就不提供了。大家需要的可以去官方的github上去下載。

地址:https://github.com/fengyuanchen/cropper

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<%@ include file="../common_front.jsp" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="${path }/front/plugins/cropper/cropper.css" rel="external nofollow" >
<script src="${path }/front/plugins/cropper/cropper.js"></script>
 <style>
 .container {
  max-width: 640px;
  margin: 20px auto;
 }
 img {
  max-width: 100%;
 }
 #result img{
  max-width: 200px;
  max-height: 200px;
 }
 .cropper-view-box,
 .cropper-face {
  border-radius: 50%;
 }
 </style>
 <script type="text/javascript">
 function getSize(size){
  var num=parseInt(size);
  if(num<=300){//先要求圖片的大小小于300之間
  return num;
  }
  return getSize(num/2);
 }
 function getRoundedCanvas(sourceCanvas) {
  var canvas = document.createElement('canvas');
  var context = canvas.getContext('2d');
  var width = sourceCanvas.width;
  var height = sourceCanvas.height;
  width=getSize(width);
  height=width;
  canvas.width = width;
  canvas.height = height;
  context.beginPath();
  //這里是控制裁剪區(qū)域的大小(這里也決定你所要生成的圖片的大小和形狀 我這邊用的是圓形的頭像 大家有別的需要可以修改)
  context.arc(width/2, height/2, Math.min(width, height)/2, 0, 2 * Math.PI);
  context.strokeStyle = 'rgba(0,0,0,0)';
  context.stroke();
  context.clip();
  context.drawImage(sourceCanvas, 0, 0, width, height);
  return canvas;
 }
 $(function(){
  var $image = $('#image');
  var $button = $('#button');
  var $result = $('#result');
  var croppable = false;
  $image.cropper({
   aspectRatio: 1,
   viewMode: 1,
   ready: function () {
    croppable = true;
   }
  });
  $button.on('click', function () {
   var croppedCanvas;
   var roundedCanvas;
   if (!croppable) {
    return;
   }
   // 裁剪
  croppedCanvas = $image.cropper('getCroppedCanvas');
  //判斷圖片大小,如果超過1080 則返回
   if(croppedCanvas.width>1080){
   alert("圖片過大,請重新選擇!");
   return false;
   }
   // 生成圓形
  roundedCanvas = getRoundedCanvas(croppedCanvas);
   //將裁剪區(qū)域的圖片轉(zhuǎn)出圖片的base64編碼,放到表單里提交到后臺。后臺再對其進(jìn)行解碼,保存。
   $("#icon").val(roundedCanvas.toDataURL());
   $.ajax({
   url:'${path }/front/saveUserIcon',
   data:$("#submitForm").serialize(),
   type:'POST',
   success:function(data){
   if(data.code==200){
    parent.location.reload(); // 父頁面刷新
      var index = parent.layer.getFrameIndex(window.name); //獲取窗口索引
      parent.layer.close(index);
   }else{
   warningAlert(data.msg);
   }
   }
   });
   return false;
 });
 //當(dāng)選擇完圖片后,直接提交表單到后臺,圖片保存后再回到此頁面。這樣此頁面的圖片裁剪畫布就改變成你所選擇的圖片了
  $("#file").change(function(){
   var fileName=$("#file").val();
   fileName=fileName.toLowerCase(); 
   if((fileName.indexOf(".jpg")!=-1)||(fileName.indexOf(".png")!=-1)||(fileName.indexOf(".jpeg")!=-1)||(fileName.indexOf(".bmp")!=-1)||(fileName.indexOf(".gif")!=-1)){
   $("#imageUploadForm").submit();   
   }else{
   alert("所選圖片格式錯誤或者不支持此類圖片格式!");
   }   
   return false;
  });
 });
</script> 
</head>
<body>
 <div class="container">
 <form enctype="multipart/form-data" method="post" id="imageUploadForm" action="${path}/front/imageUpload" >
 <span class="btn-upload">
  <a href="javascript:void();" rel="external nofollow" class="btn btn-primary radius"><i class="iconfont">&#xf0020;</i> 選擇圖片</a>
  <input type="file" name="file" id="file" class="input-file">
  <input type="hidden" name="originalImage" value="${imageRelativePath}"/>  
 </span>
 </form>
 <div>
 <c:if test="${!empty imageRelativePath }">
  <img id="image" src="${path }/${imageRelativePath}" alt="Picture">
 </c:if>
 <c:if test="${!empty userico }">
  <img id="image" src="${path }/${userico}" alt="Picture">
 </c:if>
 <c:if test="${!empty teachericon }">
  <img id="image" src="${path }/${teachericon}" alt="Picture">
 </c:if>
 </div> 
 <form id="submitForm" action="" method="post">  
  <input type="hidden" name="originalImage" value="${imageRelativePath}"/>
  <input type="hidden" name="icon" id="icon"/>
 </form>
 <input class="btn btn-primary size-M radius" type="button" id="button" value="上傳頭像">
 <div id="result"></div>
 </div>
</body>
</html>

snippet_file_0.txt

下面是我后臺處理方法,大家可以借鑒一下。后臺是ssm框架,主要是保存圖片和圖片轉(zhuǎn)碼

//用戶上傳頭像
 /**
 * 
 * @param image 選擇的圖片
 * @param model
 * @param userId 用戶id
 * @param userType 用戶類型
 * @param request
 * @param originalImage 上一張臨時圖片
 * @return
 */
 @RequestMapping(value="/imageUpload",method=RequestMethod.POST)
 public String iconImageUpload(@RequestParam(value="file",required=false)MultipartFile image,Model model,@CookieValue("userId")String userId,HttpServletRequest request,String originalImage){
 String basePath="image/";
 //web.xml里面配置的用戶圖片存儲路徑
 String userImagePath=request.getSession().getServletContext().getInitParameter("userImageSavePath");
 //圖片相對路徑 
 String imageRelativePath=FileUtils.fileUpload(image, request,basePath+userImagePath);
 System.out.println("圖片保存路徑------"+imageRelativePath);
 System.out.println("上一張臨時圖片------"+originalImage);
 //刪除上一張臨時圖片
 if(originalImage!=null){
 String basePathTemp=request.getSession().getServletContext().getRealPath("/");
 FileUtils.deleteFile(basePathTemp+originalImage);
 }
 model.addAttribute("imageRelativePath", imageRelativePath);
 model.addAttribute("userId", userId);
 return "/crop_image"; 
 }
 //將裁剪好的頭像由base64還原成圖片
 @ResponseBody
 @RequestMapping(value="/saveUserIcon",method=RequestMethod.POST)
 public Msg saveUserIcon(String icon,@CookieValue("userType")String userType,@CookieValue("userId")String userId,String originalImage,HttpServletRequest request){
 System.out.println("icon-----"+icon);
 //先生成圖片地址
 String realpath=request.getSession().getServletContext().getRealPath("/");
 String basePath="image/";
 String userImagePath=request.getSession().getServletContext().getInitParameter("userImageSavePath");
 Calendar now=Calendar.getInstance();
 String relativePath=basePath+userImagePath+"/"+now.get(Calendar.YEAR)+"/"+(now.get(Calendar.MONTH)+1)+"/"+now.get(Calendar.DAY_OF_MONTH)+"/"+FileUtils.getUUID()+".png";
 String imagePath=realpath+relativePath;
 //將base64 轉(zhuǎn)換成圖片
 FileUtils.base64ToImage(icon, imagePath);
 //刪除原圖
 if(originalImage!=null){
 FileUtils.deleteFile(realpath+originalImage); 
 }
 return Msg.success();
 }
 //下面是解碼的方法
 public static boolean base64ToImage(String base64, String path) {// 對字節(jié)數(shù)組字符串進(jìn)行Base64解碼并生成圖片 
  if (base64 == null){ // 圖像數(shù)據(jù)為空 
   return false; 
  } 
  System.out.println(base64);
  // base64 的格式為 “data:image/png;base64,****”,逗號之前都是一些說明性的文字,我們只需要逗號之后的就行了
  base64=base64.split(",")[1];
  BASE64Decoder decoder = new BASE64Decoder(); 
  try { 
   // Base64解碼 
   byte[] bytes = decoder.decodeBuffer(base64); 
   for (int i = 0; i < bytes.length; ++i) { 
    if (bytes[i] < 0) {// 調(diào)整異常數(shù)據(jù) 
     bytes[i] += 256; 
    } 
   } 
   // 生成圖片 
   OutputStream out = new FileOutputStream(path); 
   out.write(bytes); 
   out.flush(); 
   out.close(); 
   return true; 
  } catch (Exception e) { 
   return false; 
  } 
 }

總結(jié)

以上所述是小編給大家介紹的使用cropper.js裁剪頭像的實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

  • 微信小程序頁面縮放式側(cè)滑效果的實現(xiàn)代碼

    微信小程序頁面縮放式側(cè)滑效果的實現(xiàn)代碼

    這篇文章主要介紹了微信小程序頁面縮放式側(cè)滑效果的實現(xiàn)代碼,實現(xiàn)原理就是通過點(diǎn)擊按鈕,往需要動畫的div中添加或移除擁有動畫效果的class。具體實例代碼大家跟隨小編一起通過本文學(xué)習(xí)吧
    2018-11-11
  • range 標(biāo)準(zhǔn)化之獲取

    range 標(biāo)準(zhǔn)化之獲取

    range 是用戶選擇區(qū)域的唯一表示方法,存在 w3c 的標(biāo)準(zhǔn)化 range ,以及 ie 特有的 textrange 與 controlrange ,相對于 ie ,w3c 的概念更易于理解,首先簡要介紹一下 w3c range.
    2011-08-08
  • js與css的阻塞問題詳析

    js與css的阻塞問題詳析

    JS具有阻塞特性,當(dāng)瀏覽器在執(zhí)行js代碼時,不能同時做其它事情,下面這篇文章主要給大家介紹了關(guān)于js與css阻塞問題的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • JavaScript中內(nèi)存泄漏的幾種情況總結(jié)

    JavaScript中內(nèi)存泄漏的幾種情況總結(jié)

    在JavaScript中,內(nèi)存泄漏通常是由于變量、對象、閉包、事件監(jiān)聽器等長期存在而沒有被釋放引起的。本文就來和大家總結(jié)一下常見的幾種情況以及解決方法吧
    2023-05-05
  • 簡單實現(xiàn)js浮動框

    簡單實現(xiàn)js浮動框

    這篇文章主要為大家詳細(xì)介紹了如何簡單實現(xiàn)js浮動框,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 如何讓頁面加載完成后執(zhí)行js

    如何讓頁面加載完成后執(zhí)行js

    本篇文章是對如何讓頁面加載完成后執(zhí)行js的解決方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 詳談js遍歷集合(Array,Map,Set)

    詳談js遍歷集合(Array,Map,Set)

    下面小編就為大家?guī)硪黄斦刯s遍歷集合(Array,Map,Set)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • 理解Javascript_06_理解對象的創(chuàng)建過程

    理解Javascript_06_理解對象的創(chuàng)建過程

    在《理解Javascript_05_原型繼承原理》一文中已經(jīng)詳細(xì)的講解了原型鏈的實現(xiàn)原理,大家都知道原型鏈?zhǔn)腔趯ο髣?chuàng)建的(沒有對象,哪來原型),那么今天就來解析一下對象的創(chuàng)建過程。
    2010-10-10
  • Webpack中l(wèi)oader打包各種文件的方法實例

    Webpack中l(wèi)oader打包各種文件的方法實例

    這篇文章主要給大家介紹了關(guān)于Webpack中l(wèi)oader打包各種文件的相關(guān)資料,其中包括處理css文件、less文件、scss文件、url地址以及ES6高級語法的方法,需要的朋友可以參考下
    2019-09-09
  • 探析瀏覽器執(zhí)行JavaScript腳本加載與代碼執(zhí)行順序

    探析瀏覽器執(zhí)行JavaScript腳本加載與代碼執(zhí)行順序

    本文主要基于向HTML頁面引入JavaScript的幾種方式,分析HTML中JavaScript腳本的執(zhí)行順序問題,通過本文給大家分享瀏覽器執(zhí)行JavaScript腳本加載與代碼執(zhí)行順序,對瀏覽器執(zhí)行javascript及執(zhí)行順序相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01

最新評論

兰州市| 华宁县| 余庆县| 孟津县| 阿城市| 镇坪县| 苏尼特左旗| 肥乡县| 德州市| 体育| 浦江县| 屏东县| 白城市| 手游| 兰西县| 时尚| 秦皇岛市| 长汀县| 天全县| 简阳市| 水富县| 蒙城县| 宝清县| 朝阳县| 东台市| 孝义市| 邵阳市| 阿瓦提县| 磐安县| 兰考县| 栾川县| 盱眙县| 安平县| 延长县| 牡丹江市| 肇源县| 武清区| 张掖市| 卢龙县| 鹰潭市| 昭觉县|