画像プレビューの切り抜きアップロード方法
先日、互換性の良い画像アップロード機能を作りたいと思って、多くのネット上のコードを参考にして、まずswfを使う案を否定しました.携帯電話側では実現できないからです.トリミングをプレビューするため、まず元の図をサーバーにアップロードし、トリミングをプレビューする案も多く、ユーザー体験が悪く、ユーザーが長い間待つ可能性があります.模索を経て、私は1段のコードを書いて機能を実現して、先にプレビューして、更に裁断して、最後にアップロードして、指導を求めます.画像トリミングプラグインJcrop、HTML 5ファイルオブジェクトを使用しました.皆さん、もっと良い案があれば、携帯ブラウザと互換性がありますので、教えてください.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title> </title>
<meta content="width=device-width, initial-scale=1.0, minimum-scale=0.5, maximum-scale=2.0, user-scalable=yes" name="viewport" >
<link rel="stylesheet" type="text/css" href="__CSS__/jquery.Jcrop.min.css" />
<link rel="stylesheet" type="text/css" href="__CSS__/upload.css" />
<script type="text/javascript" src="__JS__/jquery.js"></script>
<script type="text/javascript" src="__JS__/jquery.Jcrop.min.js"></script>
<script type="text/javascript" src="__JS__/layer/layer.js"></script>
</head>
<body>
<input type="hidden" id='img_src'/>
<div class="main">
<form id="pic_form" class="update-pic cf" enctype="multipart/form-data" method="post" action="">
<div class="upload-area">
<input type="file" id="user-pic" name="user-pic" />
<div class="file-tips"> JPG,PNG,JPEG, 1MB, 100*100!</div>
<div class="preview hidden" id="preview-hidden"></div>
</div>
<div class="preview-area">
<input type="hidden" id="x" name="x" />
<input type="hidden" id="y" name="y" />
<input type="hidden" id="w" name="w" />
<input type="hidden" id="h" name="h" />
<input type="button" class="uppic-btn save-pic" value=" " />
</div>
</form>
</div>
<script type="text/javascript">
$(document).ready(function() {
//
$("#user-pic").change(function () {
//
var oFile = this.files[0];
var fileName = oFile.name;
var fileType = oFile.type;
// Android type ,
if(!fileType){
fileType = "image/" + fileName.split(".").pop().toLowerCase();
}
//
var rFilter = /^(image\/jpeg|image\/png|image\/jpg)$/;
if (!rFilter.test(fileType)) {
alert(' jpg、jpeg png ');
return;
}
//
if(oFile.size > 1024*1024){
alert(' 1M ');
return;
}
var preview = $('.upload-area').children('#preview-hidden');
preview.show().removeClass('hidden');
var img = $('<img id="cropbox" />');
preview.append(img);
var oImage = document.getElementById('cropbox');
var oReader = new FileReader();
oReader.readAsDataURL(oFile);
oReader.onload = function(e){
oImage.src = e.target.result;
//
oImage.onload = function(){
var img_height = 0;
var img_width = 0;
var real_height = oImage.height;
var real_width = oImage.width;
if(real_height >= real_width && real_height > 300){
var persent = real_height / 300;
real_height = 300;
real_width = real_width / persent;
}else if(real_width > real_height && real_width > 300){
var persent = real_width / 300;
real_width = 300;
real_height = real_height / persent;
}
if(real_height < 300){
img_height = (300 - real_height)/2;
}
if(real_width < 300){
img_width = (300 - real_width)/2;
}
var pic_w = (300-img_width)+'px';
var pic_h = (300-img_height)+'px';
var p_t = img_height+'px';
var p_l = img_width+'px';
preview.children('img').css({width:pic_w,height:pic_h});
preview.css({paddingTop:p_t,paddingLeft:p_l});
}
}
$('#cropbox').Jcrop({
bgColor:'#333', //
bgFade:true, //
fadeTime:1000, //
allowSelect:false, // ,
allowResize:true, //
aspectRatio: 1, //
minSize : [100,100],//
boxWidth : 300, //
boxHeight : 300, //
setSelect:[ 100, 100, 200, 200],//
onSelect: function (c){ // , !
$('#x').val(c.x);// X
$('#y').val(c.y);// Y
$('#w').val(c.w);//
$('#h').val(c.h);//
}
});
});
$('.save-pic').click(function(){
if($('#preview-hidden').html() == ''){
alert(' !');
}else{
var formData = new FormData($("#pic_form")[0]);
$.ajax({
url : '__URL__/uploadImg',//
type : 'post',
data : formData,
contentType : false,// false Content-Type
processData : false,// false jQ formdata ,XMLHttpRequest
success:function(ret){
if (ret.status==1){
//
$("#img_src").val(ret.data);
//
}else{
alert('error');
}
}
});
}
});
});
</script>
</body>
</html>