2013-05-24 7 views
7

上の画像を閲覧、私はポップアップ上の画像をアップロードしていると私は、その画像をトリミングしたい、私はJCropを使用していることのためにhttp://jsfiddle.net/UmJtB/18/ トリミングがポップアップ

コードの下
<script type="text/javascript"> 
$(document).ready(function() { 
$(".uploadphoto").click(function() { 
    if(document.getElementById('files').files.length == 0){ 
     alert('Select an Image first'); 
     return false; 
     }else { 
     // When upload button is pressed, load the Popupbox First 
     loadPopupBox(); 
       } 
     $('#popupBoxClose').click(function() {   
      unloadPopupBox(); 
     }); 

     $('#container').click(function() { 
      unloadPopupBox(); 
     }); 

     function unloadPopupBox() { // TO Unload the Popupbox 
      $('#popup_box').fadeOut("slow"); 
      $("#container").css({ // this is just for style  
       "opacity": "1" 
      }); 
     } 
     function loadPopupBox() { // To Load the Popupbox 
      $('#popup_box').fadeIn("slow"); 
      $("#container").css({ // this is just for style 
       "opacity": "1.5" 
      });   
     } 
    }); 

//$('.FieldRequired').attr('id','files'); 
// set up variables 
var reader = new FileReader(), 
    i=0, 
    numFiles = 0, 
    imageFiles; 

// use the FileReader to read image i 
function readFile() { 
    reader.readAsDataURL(imageFiles[i]) 
} 
// define function to be run when the File 
// reader has finished reading the file 
reader.onloadend = function(e) { 

    // make an image and append it to the div 
    var image = $('<img>').attr('src', e.target.result); 
    var imgdiv = $('#popup_box'); 
    $(imgdiv).append(image); 
// if there are more files run the file reader again 
    if (i < numFiles) { 
     i++; 
     readFile(); 
    } 
}; 
$(".uploadphoto").click(function() { 

    imageFiles = document.getElementById('files').files 
    // get the number of files 
    numFiles = imageFiles.length; 
    readFile();   

}); 

$(function(){ 

    $('#popup_box img').Jcrop({ 
     onChange: showPreview, 
     onSelect: showPreview, 
     aspectRatio: 1 
    }); 

}); 
function showPreview(coords) 
{ 
    var rx = 100/coords.w; 
    var ry = 100/coords.h; 

    $('#preview').css({ 
     width: Math.round(rx * 500) + 'px', 
     height: Math.round(ry * 370) + 'px', 
     marginLeft: '-' + Math.round(rx * coords.x) + 'px', 
     marginTop: '-' + Math.round(ry * coords.y) + 'px' 
    }); 
} 


}); 
</script> 
</head> 
<body> 
<input type="file" value="" size="" class="Textbox FieldRequired" name="ProductFields[3]" id="files"> 
<input type="submit" value="upload" class="uploadphoto"/> 
<div id="popup_box"> <!-- OUR PopupBox DIV--> 
<canvas id="preview" style="width:150px;height:150px;overflow:hidden;"></canvas> 
<a id="popupBoxClose">close</a> </div> 
<div id="container"> <!-- Main Page --> 

</div> 
</body> 
</html> 
<style type="text/css"> 
/* popup_box DIV-Styles*/ 
#popup_box { 
    display:none; /* Hide the DIV */ 
    position:fixed; 
    _position:absolute; /* hack for internet explorer 6 */ 
    height:600px; 
    width:600px; 
    background:#FFFFFF; 
    left: 300px; 
    top: 150px; 
    z-index:100; /* Layering (on-top of others), if you have lots of layers: I just maximized, you can change it yourself */ 
    margin-left: 15px; 
    /* additional features, can be omitted */ 
    border:2px solid #ff0000; 
    padding:15px; 
    font-size:15px; 
    -moz-box-shadow: 0 0 5px #ff0000; 
    -webkit-box-shadow: 0 0 5px #ff0000; 
    box-shadow: 0 0 5px #ff0000; 
} 
#popup_box img { 
    height:600px; 
    width:600px 
} 
#container { 
    background: #d2d2d2; /*Sample*/ 
    width:100%; 
    height:100%; 
} 
a { 
    cursor: pointer; 
    text-decoration:none; 
} 
/* This is for the positioning of the Close Link */ 
#popupBoxClose { 
    background: url("close.png") no-repeat scroll 0 0 transparent; 
    color: transparent; 
    font-size: 20px; 
    line-height: 26px; 
    position: absolute; 
    right: -28px; 
    top: -14px; 
} 
</style> 

を確認してください。それは私のために働いていません。そのポップアップで画像をキャンバスに表示したい。私を助けてください。 私はこのエラーを受けています。 エラー:NS_ERROR_INVALID_POINTER:コンポーネントが失敗したコードを返しました:0x80004003(NS_ERROR_INVALID_POINTER)[nsIDOMFileReader。 readAsDataURL] ありがとうございます!

+0

実行しているフィドル: GET http://fiddle.jshell.net/UmJtB/14/show/jquery.Jcrop.min.js 404(見つかりません)fiddle.jshell.net/:7 GETのhttp: //fiddle.jshell.net/UmJtB/14/show/jquery.Jcrop.js 404(見つかりません)fiddle.jshell.net/:7 未知の型エラー:オブジェクト[オブジェクトオブジェクト]にはメソッドがありません 'Jcrop' fiddle.jshell .net /:140 – urbananimal

+0

あなたのイメージは整列していませんが、最初はうまくいきます。私はそれを作ることができます。しかし、2回目はどうですか?それをアップロードするつもりはありません。なぜ??それは質問か設計の問題ですか? –

+0

@DhavalMarthak私はコードを更新しました。確認してください。キャンバスの高さの幅の設計がそのように表示されているので確認してください。 – Rash

答えて

3

Working Fiddle

JS変更

reader.onloadend = function (e) { 

    // make an image and append it to the div 
    var image = $('<img>').attr('src', e.target.result); 
    var theImage = new Image(); 
    theImage.src = e.target.result; 
    var imageWidth = theImage.width; 
    var imageHeight = theImage.height; 
    var imgdiv = $('#popup_box'); 
    $(imgdiv).append(image); 
    image.Jcrop({ 
     /*onChange: function(coords){showPreview(coords, image);}, */ 
     onSelect: function(coords){showPreview(coords, image, imageWidth/image.width(), imageHeight/image.height());}, 
     aspectRatio: 1 
    }); 
    // if there are more files run the file reader again 
    if (i < numFiles) { 
     i++; 
     readFile(); 
    } 
}; 

function showPreview(coords, image, width_scale, height_scale) {   
     var c=document.getElementById("preview"); 
     var ctx=c.getContext("2d"); 
     var img=image[0]; 
     if(coords.w > 0 && coords.h > 0) 
      ctx.drawImage(img,coords.x * width_scale,coords.y * height_scale,coords.w * width_scale, coords.h * height_scale, 0 , 0, 300, 150);   
    } 

まず私はonloadend関数内ロードされている画像のそれぞれにJcropプラグインを追加しました。キャンバスは、レンダリングされたhtmlイメージではなく、生のイメージで動作するので、イメージの拡大率も計算する必要があります。 onChangeイベントが発生するたびにキャンバスを描画するのはコストがかかりすぎる可能性があるため、onChangeコールバック関数を削除しました。

showPreviewコールバックは、Jcropによって渡された座標だけでなく、クロップされているイメージとそのイメージのスケールファクタを取得するように変更されました。

関連する問題