上传时往往图片分辨率过大造成问题,在这分享给大家一个裁剪的小插件,很方便,也很实用。
HTML代码模块
<!-- 图片裁剪需要引入的文件 -->
<link rel="stylesheet" href="<%=basePath%>ImageResizer/css/cropper.min.css">
<link rel="stylesheet" href="<%=basePath%>ImageResizer/css/ImgCropping.css">
<script type="text/javascript" src="<%=basePath%>ImageResizer/js/jquery.min.js"></script>
<script type="text/javascript" src="<%=basePath%>ImageResizer/js/cropper.min.js"></script>
<div class="larry-body-content clearfix">
<form class="layui-form" action="" method="post">
<div class="layui-form-item">
<label class="layui-form-label">图片:</label>
<div class="layui-input-block">
<img height="120px" width="120px" id="showImg" src="<%=basePath%>backstage/img/timg.gif">
<div id="jdt" class="layui-progress" lay-showpercent="true" lay-filter="demo" style="width: 120px;visibility:hidden;margin-top: 10px;" >
<div class="layui-progress-bar" lay-percent="0%"></div>
</div>
<span id="replaceImg" class="l-btn" style=" cursor: pointer;"><i class="layui-icon"></i>选择图片</span>
<!--隐藏域 用来存储上传后的图片地址-->
<input type="hidden" name="pnaCoverPic" id="pnaCoverPic" value="">
</div>
</div>
<!--图片裁剪器的工作页面-->
<div style="display: none" class="tailoring-container">
<div class="black-cloth" onClick="closeTailor(this)"></div>
<div class="tailoring-content">
<div class="tailoring-content-one">
<label title="上传图片" for="chooseImg" class="l-btn choose-btn">
<input type="file" accept="image/jpg,image/jpeg,image/png" name="file" id="chooseImg" class="hidden" onChange="selectImg(this)">选择图片</label>
<div class="close-tailoring" onclick="closeTailor(this)">×</div>
</div>
<div class="tailoring-content-two">
<div class="tailoring-box-parcel">
<img id="tailoringImg"></div>
<div class="preview-box-parcel">
<p>图片预览:</p>
<div class="square previewImg"></div>
<div class="circular previewImg"></div>
</div>
</div>
<div class="tailoring-content-three">
<span class="l-btn cropper-reset-btn" style=" cursor: pointer;">复位</span>
<span class="l-btn cropper-rotate-btn" style=" cursor: pointer;">旋转</span>
<span class="l-btn cropper-scaleX-btn" style=" cursor: pointer;">换向</span>
<span class="l-btn sureCut" id="sureCut" style=" cursor: pointer;">确定</span>
</div>
</div>
</div>
<div class="layui-form-item" style="text-align: center;">
<button class="layui-btn" lay-submit="" lay-filter="ok">确定</button>
<button type="layui-btn" id="cancle" class="layui-btn layui-btn-primary">取消 </button>
</div>
</form>
</div>
javascript代码部分:
<script>
layui.use([ 'form', 'layer', 'table', 'laytpl', 'laydate' ], function() {
var form = layui.form,
layer = parent.layer === undefined ? layui.layer : top.layer,
$ = layui.jquery,
laytpl = layui.laytpl,
table = layui.table,
laydate = layui.laydate;
var width = $(document).width();
var height = $(document).height();
<!-- 图片裁剪的js-->
//弹出框水平垂直居中
(window.onresize = function () {
var win_height = $(window).height();
var win_width = $(window).width();
if (win_width <= 512){
$(".tailoring-content").css({
"top": (win_height - $(".tailoring-content").outerHeight())/2,
"left": 0
});
}else{
$(".tailoring-content").css({
"top": (win_height - $(".tailoring-content").outerHeight())/2,
"left": (win_width - $(".tailoring-content").outerWidth())/2
});
}
})();
//弹出图片裁剪框
$("#replaceImg").on("click",function () {
$(".tailoring-container").css('display','block');
});
//cropper图片裁剪
$('#tailoringImg').cropper({
aspectRatio: 300/300,//默认比例
preview: '.previewImg',//预览视图
guides: false, //裁剪框的虚线(九宫格)
autoCropArea: 1, //0-1之间的数值,定义自动剪裁区域的大小,默认0.8
movable: false, //是否允许移动图片
dragCrop: true, //是否允许移除当前的剪裁框,并通过拖动来新建一个剪裁框区域
movable: true, //是否允许移动剪裁框
resizable: true, //是否允许改变裁剪框的大小
zoomable: false, //是否允许缩放图片大小
mouseWheelZoom: false, //是否允许通过鼠标滚轮来缩放图片
touchDragZoom: true, //是否允许通过触摸移动来缩放图片
rotatable: true, //是否允许旋转图片
crop: function(e) {
// 输出结果数据裁剪图像。
}
});
//旋转
$(".cropper-rotate-btn").on("click",function () {
$('#tailoringImg').cropper("rotate", 45);
});
//复位
$(".cropper-reset-btn").on("click",function () {
$('#tailoringImg').cropper("reset");
});
//换向
var flagX = true;
$(".cropper-scaleX-btn").on("click",function () {
if(flagX){
$('#tailoringImg').cropper("scaleX", -1);
flagX = false;
}else{
$('#tailoringImg').cropper("scaleX", 1);
flagX = true;
}
flagX != flagX;
});
//裁剪后的处理
$("#sureCut").on("click",function () {
if ($("#tailoringImg").attr("src") == null ){
return false;
}else{
var cas = $('#tailoringImg').cropper('getCroppedCanvas');//获取被裁剪后的canvas
var base64url = cas.toDataURL('image/png'); //转换为base64地址形式
//console.log(base64url);
putb64(base64url);
//关闭裁剪框
closeTailor();
}
});
});
//图像上传
function selectImg(file) {
if (!file.files || !file.files[0]){
return;
}
var reader = new FileReader();
reader.onload = function (evt) {
var replaceSrc = evt.target.result;
//更换cropper的图片
$('#tailoringImg').cropper('replace', replaceSrc,false);//默认false,适应高度,不失真
}
reader.readAsDataURL(file.files[0]);
}
function putb64(picBase){
var qitoken="";
$.ajax({
url: '<%=basePath%>manager/getQiNiuToken',/*base64上传获取七牛token Url*/
type: 'post',
async: false,
dataType: "json",
success: function (data) {
console.log(data)
if (data.state == 200) {//给七牛Token赋值
qitoken=data.data;
}
}, error: function () {
top.layer.msg("系统异常!", {icon: 2});
}
});
//七牛云官方文档方法
/*picUrl用来存储返回来的url*/
var picUrl;
/*把头部的data:image/png;base64,去掉。(注意:base64后面的逗号也去掉)*/
picBase=picBase.substring(22);
/*通过base64编码字符流计算文件流大小函数*/
function fileSize(str) {
var fileSize;
if(str.indexOf('=')>0) {
var indexOf=str.indexOf('=');
str=str.substring(0,indexOf);//把末尾的’=‘号去掉
}
fileSize=parseInt(str.length-(str.length/8)*2);
return fileSize;
}
/*把字符串转换成json*/
function strToJson(str) {
var json = eval('(' + str + ')');
return json;
}
//http://upload-z2.qiniu.com/putb64/ 只适用于七牛云华南空间 因为我的是七牛云华南空间,如果不是华南空间需要根据七牛云文档进行更改
var url = "https://upload-z0.qiniup.com/putb64/"+fileSize(picBase);
var xhr = new XMLHttpRequest();
xhr.onreadystatechange=function(){
if (xhr.readyState==4){
var keyText=xhr.responseText;
/*返回的key是字符串,需要装换成json*/
keyText=strToJson(keyText);
/* http://image.haoqiure.com/ 是我的七牛云空间网址,keyText.key 是返回的图片文件名*/
picUrl="http://palnam4t2.bkt.clouddn.com/"+keyText.key;
// console.log(picUrl);
// $("#imgShowurl").val(picUrl) //将图片链接显示在输入框去
$("#showImg").prop("src",picUrl);//显示为图片的形式
$("#pnaCoverPic").val(picUrl);//给隐藏域赋值
}
}
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-Type", "application/octet-stream");
xhr.setRequestHeader("Authorization", "UpToken "+qitoken+"");
xhr.send(picBase);
}
//关闭裁剪框
function closeTailor() {
$(".tailoring-container").toggle();
}
</script>
下面是效果图:
所需css和js在下面