私は現在、ユーザーが複数の画像をアップロードして同時に使用できるアプリケーションを構築しています。一部のプロセスは大きなイメージファイルのためにパフォーマンスが悪いため、ユーザーが取得する前にサイズを変更する必要があります。img.onloadで関数を返す方法は?
私のresizer()
では、キャンバスを使用してサイズを変更しようとしています。それは動作しますが、 'canvas.toDataURL()'はimg.onload
関数の中にあるので、値を返す方法とそれをhandleFiles()
関数に解析する方法はわかりません。
も...私はhandleFiles()
からいくつかのコード取得した場所にいくつかの例を試みた - のような:
var preview = document.getElementById("img"+count);
var surface = document.getElementById("cubface"+count);
var count = counterImg();
preview.src = resizer(e.target.result, count);
surface.src = resizer(e.target.result, count);
をそして
var preview = document.getElementById("img"+number);
var surface = document.getElementById("cubface"+number);
preview.src = canvas.toDataURL;
surface.src = canvas.toDataURL;
私のようimg.onload
関数の最後に入れてリサイズを得ましたが、処理されるループの最後の画像しか得られませんでした。
だから、質問は以下のとおりです。resizer()
機能で
、
img.onload
であるcanvas.toDataURL
値を返す方法?なぜループは最後のインスタンスのみをカバーし、すべてのイメージではなく、それを解決するのでしょうか?
全コード:
はJavaScript:
function resizer(base64, number){
// Max size for thumbnail
if(typeof(maxWidth) === 'undefined') maxWidth = 1200;
if(typeof(maxHeight) === 'undefined') maxHeight = 1200;
var img = new Image();
img.src = base64;
// Create and initialize two canvas
var canvas = document.createElement("canvas");
var ctx = canvas.getContext("2d");
var canvasCopy = document.createElement("canvas");
var copyContext = canvasCopy.getContext("2d");
img.onload = function() {
// Determine new ratio based on max size
var ratio = 1;
if (img.width > maxWidth)
ratio = maxWidth/img.width;
else if (img.height > maxHeight)
ratio = maxHeight/img.height;
// Draw original image in second canvas
canvasCopy.width = img.width;
canvasCopy.height = img.height;
copyContext.drawImage(img, 0, 0);
// Copy and resize second canvas to first canvas
canvas.width = img.width * ratio;
canvas.height = img.height * ratio;
ctx.drawImage(canvasCopy, 0, 0, canvasCopy.width, canvasCopy.height, 0, 0, canvas.width, canvas.height);
return canvas.toDataURL();
};
return img.onload;
}
function handleFiles(files) {
for (var i = 0; i < files.length; i++) {
var file = files[i];
var count = counterImg();
var preview = document.getElementById("img"+count);
var surface = document.getElementById("cubface"+count);
var reader = new FileReader();
reader.onload = (function (preview, surface) {
return function (e) {
var newimage = resizer(e.target.result, count);
preview.src = newimage;
surface.src = newimage;
$('#image-cropper'+count).cropit('imageSrc', e.target.result);
}
})(preview, surface);
reader.readAsDataURL(file);
}
}
あなたは確かで$( '#イメージ・クロッパーということです'+ count)変数の数は適切にスコープされていますか?関数(プレビュー、サーフェス)に追加することができます。 – user3220633
それはちょうどこの関数です: 'var j = 0; function counterImg(){ j ++; return j; } ' – PLAYCUBE