前端頁面完整代碼,複製可用,記得導入庫文件javascript
<!DOCTYPE html> <html lang="en"> <head> <title>Aspect Ratio with Preview Pane | Jcrop Demo</title> <meta http-equiv="Content-type" content="text/html;charset=UTF-8" /> <script src="/Jcrop-0.9.12/js/jquery.min.js"></script> <script src="/Jcrop-0.9.12/js/jquery.Jcrop.js"></script> <script src="/Jcrop-0.9.12/js/imgCropUpload.js"></script> <link rel="stylesheet" href="/Jcrop-0.9.12/css/jquery.Jcrop.css" type="text/css" /> <style type="text/css"> body { font-size: 16px; font-family: "Microsoft YaHei", Arial, Helvetica, sans-serif } *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; box-sizing: border-box; } .crop-picker-wrap { position: relative; width: 100px; height: 30px; overflow: hidden; } .crop-picker { width: 100%; height: 100%; line-height: 1; -webkit-appearance: none; margin: 0; border: none; border-radius: 5px; padding: 9px 0; background-color: #1ab2ff; color: #fff; cursor: pointer; } .crop-picker-file { position: absolute; top: 0; right: 0; height: 100%; opacity: 0; cursor: pointer; filter: alpha(opacity = 0); } .crop-wrapper { display: inline-block; min-width: 750px; margin: 10px 0; padding: 10px; border: 1px solid #ccc; border-radius: 5px; box-shadow: 0 0 5px 2px #ccc; } .crop-container { font-size: 0; } .crop-container img[src=""] { visibility: hidden; } .crop-area-wrapper, .crop-preview-wrapper { display: inline-block; vertical-align: top; } .crop-area-wrapper { width: 500px; height: 400px; } .crop-preview-wrapper { width: 200px; height: 200px; margin-left: 28px; overflow: hidden; } .crop-preview-container { position: relative; overflow: hidden; } .crop-operate { text-align: center; margin: 10px 0; } .crop-save, .crop-cancel { display: inline-block; vertical-align: middle; width: 150px; height: 50px; line-height: 50px; -webkit-appearance: none; margin: 0 5px; border: none; border-radius: 5px; background-color: #1ab2ff; color: #fff; cursor: pointer; } #uploadIfr { display: none; } .crop-picker-wrap { position: relative; width: 100px; height: 30px; overflow: hidden; margin-top: 10px; } </style> </head> <body> <form id="coords" class="coords" onsubmit="return false;" action=""> <div class="inline-labels"> <label>X1 <input type="text" size="4" id="x1" name="x1" /></label> <label>Y1 <input type="text" size="4" id="y1" name="y1" /> </label> <label>X2 <input type="text" size="4" id="x2" name="x2" /></label> <label>Y2 <input type="text" size="4" id="y2" name="y2" /></label> <label>W <input type="text" size="4" id="w" name="w" /> </label> <label>H <input type="text" size="4" id="h" name="h" /></label> </div> </form> <div id="TCrop"></div> <button id="btn">上傳頭像</button> <script type="text/javascript"> $(function() { Crop.init({ id: 'TCrop', /* 上傳路徑 */ url: '', /* 容許上傳的圖片的後綴 */ allowsuf: ['jpg', 'jpeg', 'png', 'gif'], /* JCrop參數設置 */ cropParam: { minSize: [100, 100], // 選框最小尺寸 maxSize: [300, 300], // 選框最大尺寸 allowSelect: true, // 容許新選框 allowMove: true, // 容許選框移動 allowResize: true, // 容許選框縮放 dragEdges: true, // 容許拖動邊框 onChange: function(c) { $('#x1').val(c.x); $('#y1').val(c.y); $('#x2').val(c.x2); $('#y2').val(c.y2); $('#w').val(c.w); $('#h').val(c.h); }, // 選框改變時的事件,參數c={x, y, x1, y1, w, h} onSelect: function(c) { $('#x1').val(c.x); $('#y1').val(c.y); $('#x2').val(c.x2); $('#y2').val(c.y2); $('#w').val(c.w); $('#h').val(c.h); } // 選框選定時的事件,參數c={x, y, x1, y1, w, h} }, /* 是否進行裁剪,不裁剪則按原圖上傳,默認進行裁剪 */ isCrop: true, /* 圖片上傳完成以後的回調,不管是否成功上傳 */ onComplete: function(data) { console.log('upload complete!'); } }); }); /* 上傳頭像 */ $(function(){ $("#btn").click(function(){ var form = document.getElementById("coords");//獲取到form表單 var formData = new FormData(form);//建立一個formData對象,將表單中的數據放進去 //for(var i=0; i<$('#file')[0].files.length;i++){//使用for循環將選擇的文件一個一個添加(append)到formData對象中 formData.append('img0', $('#file')[0].files[0]);//注意:若是你使用的是jfinal框架這裏的key(img)必須是不一樣的,若是相同的話文件能上傳可是拿上傳文件名的時候只能拿到一個 //} var x1 = $('#x1').val(), x2 = $('#x2').val(), y1 = $('#y1').val(), y2 = $('#y2').val(); formData.append('x11',x1 ); formData.append('y11',y1 ); formData.append('x22',x2 ); formData.append('y22',y2 ); formData.append('tw',$(".jcrop-holder").css("width") ); formData.append('ty',$(".jcrop-holder").css("height") ); $.ajax({//ajax url: "/upload/uploadHeaderPic", type: "POST", processData : false,//不處理數據,必須爲false contentType : false,//不設置內容類型,必須爲false data: formData, dataType:"json", success: function(data){ //layer.msg(data.msg) alert(data.msg); console.log("msg",data.msg) }, error:function(e){ console.log("msg","ajax調用出現錯誤") } }); }); }); </script> </body> </html>
這個js文件網上找的,通過同事幫助改動。目前可用,有些地方看不懂,不過這個js,我主要用的地方就是圖片的預覽。參數傳遞仍是本身寫方法進行傳的
;(function(global, $, Crop) { var defaultOpt = { /* 整個圖片選擇、裁剪、上傳區域的最外圍包裹元素id,默認TCrop */ id: 'TCrop', /* 上傳路徑 */ url: '', /* 容許上傳的圖片的後綴,暫時支持如下四種,其他格式圖片未測試 */ allowsuf: ['jpg', 'jpeg', 'png', 'gif'], /* JCrop參數設置 */ cropParam: { minSize: [50, 50], // 選框最小尺寸 maxSize: [300, 300], // 選框最大尺寸 allowSelect: true, // 容許新選框 allowMove: true, // 容許選框移動 allowResize: true, // 容許選框縮放 dragEdges: true, // 容許拖動邊框 onChange: function(c) {}, // 選框改變時的事件 onSelect: function(c) {} // 選框選定時的事件,參數c={x, y, x1, y1, w, h} }, /* 是否進行裁剪,不裁剪則按原圖上傳,默認進行裁剪 */ isCrop: true, /* 圖片上傳完成以後的回調,不管是否成功上傳 */ onComplete: function(data) { console.log('upload complete!'); } }; /* 記錄jcrop實例 */ var jcropApi; /* 建立Dom結構 */ /* 完整DOM結構 --s-- */ /* <iframe id="uploadIfr" name="uploadIfr" class="crop-upload-ifr"></iframe> <form action="index.html" enctype="multipart/form-data" method="post" target="uploadIfr"> <input type="hidden" name="cropData"> <div class="crop-picker-wrap"> <button class="crop-picker" type="button">選擇圖片</button> <input type="file" id="file" class="crop-picker-file"> </div> <div class="crop-wrapper"> <div class="crop-container clearfix"> <div class="crop-area-wrapper"><img src="" alt=""></div> <div class="crop-preview-wrapper"><img src="" alt=""></div> </div> <div class="crop-operate"> <div class="crop-save">上傳原圖</div> <div class="crop-save">保存截圖</div> <div class="crop-cancel">取消</div> </div> </div> </form> */ /* 完整DOM結構 --e-- */ function _createDom($wrap, opt) { var accept = 'image/' + opt.allowsuf.join(', image/'); var $ifr = $('<iframe id="uploadIfr" name="uploadIfr" class="crop-hidden"></iframe>'); var $form = $('<form action="' + opt.url + '" enctype="multipart/form-data" method="post" target="uploadIfr"/>'); var $cropDataInp = $('<input type="hidden" name="cropData">'); var $picker = $('<div class="crop-picker-wrap"><button class="crop-picker" type="button">選擇圖片</button></div>'); var $fileInp = $('<input type="file" id="file" accept="' + accept + '" class="crop-picker-file">'); $picker.append($fileInp); $form.append($cropDataInp).append($picker); var $cropWrap = $('<div class="crop-wrapper crop-hidden"/>'); var $cropArea = $('<div class="crop-area-wrapper"></div>'); var $cropPreviewWrap = $('<div class="crop-preview-wrapper"></div>'); var $cropPreview = $('<div class="crop-preview-container"/>'); $cropPreviewWrap.append($cropPreview); var $cropContainer = $('<div class="crop-container"/>').append($cropArea).append($cropPreviewWrap); $cropWrap.append($cropContainer); // var $saveSource = $('<div class="crop-save">上傳原圖</div>'); //var $save = $('<div class="crop-save">保存</div>'); // var $cropCancel = $('<div class="crop-cancel">取消</div>'); // var $cropOpe = $('<div class="crop-operate"/>').append($save).append($cropCancel); if(!opt.isCrop) { $cropPreviewWrap.addClass('crop-hidden'); } // $cropWrap.append($cropOpe); $form.append($cropWrap); $wrap.append($ifr).append($form); return { $ifr: $ifr, $form: $form, $cropDataInp: $cropDataInp, $cropPicker: $picker, $fileInp: $fileInp, $cropWrap: $cropWrap, $cropArea: $cropArea, $cropPreview: $cropPreview, // $saveSource: $saveSource, // $save: $save, //$cancel: $cropCancel }; }; /* * 綁定事件 * */ function _bind($cropObj, opt) { var $cropPicker = $cropObj.$cropPicker; var $fileInp = $cropObj.$fileInp; var $save = $cropObj.$save; var $cancel = $cropObj.$cancel; var $ifr = $cropObj.$ifr; $fileInp.change(function(eve) { if(!this.value) {return ;} var fileSuf = this.value.substring(this.value.lastIndexOf('.') + 1); if(!_checkSuf(fileSuf, opt.allowsuf)) { alert('只容許上傳後綴名爲' + opt.allowsuf.join(',') + '的圖片'); return ; } /* 進入裁剪流程 */ _crop($cropObj, this); $cropPicker.addClass('crop-hidden').next().removeClass('crop-hidden'); }); /* $save.click(function(eve) { eve.preventDefault(); Crop.upload(); });*/ /*$cancel.click(function(eve) { eve.preventDefault(); Crop.cancel(); }); */ /* iframe的load應該延遲綁定,避免首次插入文檔中加載完畢時觸發load事件 */ window.setTimeout(function() { $ifr.load(function() { var body = this.contentWindow.document.body; var text = body.innerText; opt.onComplete(text); }); }, 100); }; /* 檢查文件是否符合上傳條件 */ function _checkSuf(fileSuf, suffixs) { for(var i = 0, j = suffixs.length;i < j; i ++) { if(fileSuf.toLowerCase() == suffixs[i].toLowerCase()) { return true; } } return false; }; /* 主要裁剪流程 */ function _crop($cropObj, fileInp) { var cropArea = $cropObj.$cropArea.get(0); var cropPreview = $cropObj.$cropPreview.get(0); var opt = _getOpt(); var jcropOpt = opt.cropParam; cropArea.innerHTML = ''; if(fileInp.files && fileInp.files[0]) { var img = document.createElement('img'); img.style.visibility = 'hidden'; cropArea.appendChild(img); img.onload = function() { /* 在圖片加載完成以後即可以獲取原圖的大小,根據原圖大小和預覽區域大小獲取圖片的縮放比例以及原圖在預覽時所展示的大小 */ var scaleOpt = _getScale(cropArea.clientWidth, cropArea.clientHeight, img.offsetWidth, img.offsetHeight); img.setAttribute('style', 'position: absolute;visibility: visible;width: ' + scaleOpt.w + 'px;height: ' + scaleOpt.h + 'px'); if(!opt.isCrop) {return ;} var cropPreviewImg = img.cloneNode(true); cropPreview.appendChild(cropPreviewImg); _startCrop(img, jcropOpt); /* 記錄原始比例,上傳數據須要還原實際裁剪尺寸 */ Crop.ratio = scaleOpt.scale; /* 記錄裁剪圖片及裁剪預覽圖像對象,更新預覽圖時須要使用 */ Crop.cropPreview = { cropAreaImg: img, cropPreviewImg: cropPreviewImg }; }; var fr = new FileReader(); fr.onload = function(eve) { img.src = eve.target.result; } fr.readAsDataURL(fileInp.files[0]); } else { var img = document.createElement('div'); img.style.visibility = 'hidden'; img.style.width = '100%'; img.style.height = '100%'; cropArea.appendChild(img); fileInp.select(); var src = document.selection.createRange().text; // console.log(document.selection.createRange()); var img_filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod='image',src='" + src + "')"; img.style.filter = img_filter; /* 需等待濾鏡加載完畢以後才能進行下一步操做 */ window.setTimeout(function() { _loadFiter(cropArea, img); }, 100); } }; /* 加載濾鏡,等待兩秒,超時則斷定加載失敗 */ function _loadFiter(cropArea, img) { var time = 0; if(img.offsetWidth != cropArea.clientWidth) { /* 濾鏡加載成功,進入裁剪流程 */ _filterCrop(cropArea, img); } else { time ++; if(time < 20) { window.setTimeout(function() { _loadFiter(cropArea, img); }, 100); } else { alert('圖片加載失敗,請重試!'); } } }; /* 使用濾鏡的裁剪 */ function _filterCrop(cropArea, img) { var scaleOpt = _getScale(cropArea.clientWidth, cropArea.clientHeight, img.offsetWidth, img.offsetHeight); /* 更改濾鏡設置 */ var s_filter = img.style.filter.replace(/sizingMethod='image'/g, "sizingMethod='scale'"); var jcropOpt = _getOpt().cropParam; img.setAttribute('style', 'position: absolute;visibility: visible;width: ' + scaleOpt.w + 'px;height: ' + scaleOpt.h + 'px;filter: ' + s_filter); if(!_getOpt().isCrop) {return ;} var cropPreview = cropArea.nextSibling.firstChild; var cropPreviewImg = img.cloneNode(true); cropPreview.appendChild(cropPreviewImg); _startCrop(img, jcropOpt); /* 記錄原始比例,上傳數據須要還原實際裁剪尺寸 */ Crop.ratio = scaleOpt.scale; /* 記錄裁剪圖片及裁剪預覽圖像對象,更新預覽圖時須要使用 */ Crop.cropPreview = { cropAreaImg: img, cropPreviewImg: cropPreviewImg }; }; /* 開始裁剪,初始化裁剪插件 */ function _startCrop(img, jcropOpt) { var imgW = img.offsetWidth; var imgH = img.offsetHeight; var minW = jcropOpt.minSize[0], minH = jcropOpt.minSize[1]; var offsetWidth = (imgW / 2) - (minW / 2); var offsetHeight = (imgH / 2) - (minH / 2); var obj = { x: offsetWidth, y: offsetHeight, x2: offsetWidth + minW, y2: offsetHeight + minH, w: minW, h: minH }; $(img).Jcrop(jcropOpt, function() { jcropApi = this; this.animateTo([obj.x, obj.y, obj.x2, obj.y2]); }); }; /* 獲取配置參數opt */ function _getOpt() { var id = Crop.crop.id; var cropDom = document.getElementById(id); var opt = $.data(cropDom, 'crop').opt; return opt; }; /* * 獲取縮放比例 * * 原始寬高vw,vh * 實際顯示寬高sw,sh * 返回: * {w,h,scale:max(sw/vw,sh/vh)} * w,h均爲縮放到sw、sh後的寬高 */ function _getScale(vw, vh, sw, sh) { vw = Number(vw); vh = Number(vh); sw = Number(sw); sh = Number(sh); if(vw <= 0 || vh <= 0) { console.log('參數不能爲0'); return false; } var wScale = sw / vw; var hScale = sh / vh; var scale = 1, w, h; if(wScale > hScale) { scale = wScale; w = vw; h = sh / scale; } else { scale = hScale; h = vh; w = sw / scale; } return { scale: scale, w: w, h: h }; }; /* 更新裁剪預覽圖 */ function _updatePreview(c) { var cropAreaImg = Crop.cropPreview.cropAreaImg; var cropPreviewImg = Crop.cropPreview.cropPreviewImg; var $cropObj = $.data(document.getElementById(Crop.crop.id), 'crop').$cropObj; var $cropDataInp = $cropObj.$cropDataInp; var $cropPreview = $cropObj.$cropPreview; var $previewParent = $cropPreview.parent(); var vw = $previewParent.width(), vh = $previewParent.height(); var scaleOpt = _getScale(vw, vh, c.w, c.h); $cropPreview.width(scaleOpt.w); $cropPreview.height(scaleOpt.h); var width = $(cropAreaImg).width() / scaleOpt.scale; var height = $(cropAreaImg).height() / scaleOpt.scale; var top = -(c.y / scaleOpt.scale); var left = -(c.x / scaleOpt.scale); cropPreviewImg.style.width = width + 'px'; cropPreviewImg.style.height = height + 'px'; cropPreviewImg.style.top = top + 'px'; cropPreviewImg.style.left = left + 'px'; _setCropData($cropDataInp, c); }; /* 設置裁剪數據 */ function _setCropData($cropDataInp, c) { var ratio = Crop.ratio; var data = { x: c.x * ratio, y: c.y * ratio, w: c.w * ratio, h: c.h * ratio }; var dataJson = JSON.stringify(data); $cropDataInp.val(dataJson); }; /* 擴展配置參數,尤爲是Jcrop裁剪參數中的onSelect,onChange參數 */ function _extendOpt(opt) { opt = $.extend(true, {}, defaultOpt, opt); var select = opt.cropParam.onSelect; var change = opt.cropParam.onChange; if(Object.prototype.toString.call(select) == '[object Function]') { opt.cropParam.onSelect = function(c) { _updatePreview.call(jcropApi, c); select.call(jcropApi, c); }; } else { opt.cropParam.onSelect = _updatePreview; } if(Object.prototype.toString.call(change) == '[object Function]') { opt.cropParam.onChange = function(c) { _updatePreview.call(jcropApi, c); change.call(jcropApi, c); } } else { opt.cropParam.onChange = _updatePreview; } return opt; }; /* 初始化上傳裁剪區域 */ function init(opt) { var opt = _extendOpt(opt); var $uploadCropWrap = $('#' + opt.id); var hasDom = true; if($uploadCropWrap.length == 0) { $uploadCropWrap = $('<div id="' + opt.id + '" />'); hasDom = false; } /* 清空Dom原有內部結構 */ $uploadCropWrap.html(''); var $cropObj = _createDom($uploadCropWrap, opt); $.data($uploadCropWrap.get(0), 'crop', {opt: opt, $cropObj: $cropObj}); hasDom || $('body').append($uploadCropWrap); _bind($cropObj, opt); Crop.crop = {id: opt.id, hasDom: hasDom}; }; /* 上傳 */ function upload() { var id = (Crop.crop && Crop.crop.id) || ''; var dom = document.getElementById(id); if(!dom) { return ; } var form = $.data(dom, 'crop').$cropObj.$form.get(0); form.submit(); }; /* 取消裁剪 */ function cancel() { var id = (Crop.crop && Crop.crop.id) || ""; var dom = document.getElementById(id); if(!dom) { return ; } var $cropObj = $.data(dom, 'crop').$cropObj; $cropObj.$cropWrap.addClass('crop-hidden'); $cropObj.$cropPicker.removeClass('crop-hidden'); }; /* 銷燬上傳裁剪區域 */ function destroy() { var crop = Crop.crop || {}; var $cropWrap = $('#' + crop.id); if(crop.hasDom === true) { $cropWrap.html(''); } else { $cropWrap.remove(); } }; if($.isEmptyObject(Crop)) { global.Crop = Crop = { init: init, upload: upload, cancel: cancel, destroy: destroy, crop: {} }; } else { Crop = $.extend(Crop, { init: init, upload: upload, cancel: cancel, destroy: destroy, crop: {} }); } })(window, jQuery, window.Crop || {});
前端就這兩個是主要的文件,網上找不到的,其餘的文件都是能夠找到的,貼出來文件圖css
主要文件就兩個,jquery.Jcrop.css,jquery.Jcrop.jshtml
均可以找到本身去下載就能夠。前端
前端好了就是後臺代碼了,使用jfinal作的java
工具類主要用到了裁剪和縮放
package cn.rjj.common.tools; import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.Iterator; import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; public class ImageTool { /** * 對圖片進行剪裁,只保存選中的區域 * * @param img * 原圖路徑 * @param dest * 目標路徑 * @param top * 裁剪圖片的開始位置,距離頂部的高度 * @param left * 裁剪圖片的開始位置,距離左邊部的距離 * @param width * 目標圖片的寬度 * @param height * 目標圖片高度 * @param tw * 原圖頁面顯示寬度 * @param ty * 原圖頁面顯示高度 * * @return * @throws IOException */ public static boolean saveImage(File img, String dest, int top, int left, int width, int height, int tw, int ty) { try { File fileDest = new File(dest); if (!fileDest.getParentFile().exists()) fileDest.getParentFile().mkdirs(); // 讀取原圖 BufferedImage bfi = (BufferedImage) ImageIO.read(img); // 得到原圖片的大小,而且按照前端頁面中設置的圖片的大小,縮放寬高 BufferedImage bi = resizeImage(bfi, BufferedImage.TYPE_INT_ARGB, tw, ty); // 下邊是裁剪,要裁剪的圖片,目標寬高大於實際寬高就取實際寬高,小於,就拿到目標寬高 height = Math.min(height, bi.getHeight()); width = Math.min(width, bi.getWidth()); // 若是截取的寬高小於等於0,那麼就保留實際寬高 if (height <= 0) height = bi.getHeight(); if (width <= 0) width = bi.getWidth(); top = Math.min(Math.max(0, top), bi.getHeight() - height); left = Math.min(Math.max(0, left), bi.getWidth() - width); // 截取圖片,.getSubimage(left(左邊位置), top(上邊位置), width(要截圖的寬), // height(要截取圖片的高度)); BufferedImage bi_cropper = bi.getSubimage(left, top, width, height); return ImageIO.write(bi_cropper, "jpeg", fileDest); } catch (IOException e) { e.printStackTrace(); } return false; } /** * 縮小後的圖片 * * @author * @time 2018年8月3日下午9:13:23 * @param originalImage * @param type * @param targetWidth * @param targetHeught * @return * @throws FileNotFoundException * BufferedImage */ private static BufferedImage resizeImage(BufferedImage originalImage, int type, int targetWidth, int targetHeught) throws FileNotFoundException { /* * 這個出來的像素不好,有興趣的能夠本身研究下 BufferedImage resizedImage = new * BufferedImage(IMG_WIDTH, IMG_HEIGHT, type); Graphics2D g = * resizedImage.createGraphics(); g.drawImage(originalImage, 0, 0, * IMG_WIDTH, IMG_HEIGHT, null); g.dispose(); */ // 構建圖片流 BufferedImage tag = new BufferedImage(targetWidth, targetHeught, BufferedImage.TYPE_INT_RGB); // 繪製改變尺寸後的圖 tag.getGraphics().drawImage(originalImage, 0, 0, targetWidth, targetHeught, null); // 輸出流 // 這裏是測試,爲了看下這個圖片縮放後的樣子 /* * try { ImageIO.write(tag, "jpeg", new * FileOutputStream("E:/copy.jpg")); } catch (IOException e) { // TODO * Auto-generated catch block e.printStackTrace(); } */ return tag; } /** * 對圖片裁剪,並把裁剪新圖片保存 * * @param srcPath * 讀取源圖片路徑 * @param toPath * 寫入圖片路徑 * @param x * 剪切起始點x座標 * @param y * 剪切起始點y座標 * @param width * 剪切寬度 * @param height * 剪切高度 * @param readImageFormat * 讀取圖片格式 * @param writeImageFormat * 寫入圖片格式 * @return * @throws IOException */ public boolean cropImage(String srcPath, String toPath, int x, int y, int width, int height, String readImageFormat, String writeImageFormat) { try { FileInputStream fis = null; ImageInputStream iis = null; try { // 讀取圖片文件 fis = new FileInputStream(srcPath); Iterator<?> it = ImageIO.getImageReadersByFormatName(readImageFormat); ImageReader reader = (ImageReader) it.next(); // 獲取圖片流 iis = ImageIO.createImageInputStream(fis); reader.setInput(iis, true); ImageReadParam param = reader.getDefaultReadParam(); // 定義一個矩形 Rectangle rect = new Rectangle(x, y, width, height); // 提供一個 BufferedImage,將其用做解碼像素數據的目標。 param.setSourceRegion(rect); BufferedImage bi = reader.read(0, param); // 保存新圖片 ImageIO.write(bi, writeImageFormat, new File(toPath)); return true; } finally { if (fis != null) fis.close(); if (iis != null) iis.close(); } } catch (FileNotFoundException e) { e.printStackTrace(); return false; } catch (IOException e) { e.printStackTrace(); return false; } } }
最後就是主要代碼,controller中的操做。這裏只是上傳的操做作了,能夠根據本身的業務,把圖片保存的時候把路徑保留到,使得圖片路徑和用戶關聯,這樣顯示用戶頭像的時候,直接拿到路徑,就能夠顯示圖片了
package cn.rjj.common.upload; import java.io.File; import java.util.Date; import java.util.List; import com.alibaba.fastjson.JSONObject; import com.jfinal.core.Controller; import com.jfinal.kit.PathKit; import com.jfinal.upload.UploadFile; import cn.rjj.common.tools.ImageTool; /** * * @author * url:/upload */ public class UploadHeardPicture extends Controller { public void index(){ redirect("/upload/toUploadHeadPicture"); } /** * 上傳頭像頁面 * url:/upload/toUploadHeadPicture */ public void toUploadHeadPicture(){ render("headUpload.html"); } /** * 頭像上傳 * url:/upload/uploadHeaderPic * * 先把圖片上傳到服務其上,根據參數進行裁剪,而後把原來的那張圖片刪除,就能夠了。把資源也省下來了 */ public void uploadHeaderPic() { File file = new File("/upload/head"); if(!file.exists()){ file.mkdirs(); } //設置圖片上傳位置 List<UploadFile> files = getFiles("head"); //得到參數 int left= (int) Math.round(Double.parseDouble(getPara("x11"))); int top= (int) Math.round(Double.parseDouble(getPara("y11"))); int width= (int) Math.round(Double.parseDouble(getPara("w"))) ; int height= (int) Math.round(Double.parseDouble(getPara("h"))) ; String para = getPara("tw"); String para2 = getPara("ty"); String substring = para.substring(0,para.length()-2); int tw= (int) Math.round(Double.parseDouble(substring)) ; String substring2 = para2.substring(0,para2.length()-2); int ty= (int) Math.round(Double.parseDouble(substring2)) ; JSONObject json= new JSONObject(); UploadFile uploadFile = getFile("img0"); //for (UploadFile uploadFile : files) { File source = uploadFile.getFile(); String fileName = source.getName(); // boolean isSave = cropImage(source.getPath(),PathKit.getWebRootPath()+"/upload/head/" + new Date().getTime()+fileName,top,left,width,height,"jpg","jpg"); //這個是對圖片進行縮放後在裁剪的 boolean isSave = ImageTool.saveImage(source,PathKit.getWebRootPath()+"/upload/head/" + new Date().getTime()+fileName,top,left,width,height,tw,ty); //刪除原來的圖片, source.delete(); if(isSave){ json.put("msg", "頭像更新成功!"); }else{ json.put("msg", "頭像更新失敗!"); } // } renderJson(json); } }
我把完整項目放到https://download.csdn.net/download/qq_20359393/10584618jquery
能夠去下載實驗效果。項目能夠再次優化。目前只是實現了須要的功能。web
若是出現問題ajax
這個通常是少了一個jar包json
千萬記得上傳都是須要這個jar包的app