3

ここでサンプルコードを作成しましたhttp://jsfiddle.net/kamlesh_bhure/YpejU/ここで、画像を回転させ、最大の高さと幅に従ってサイズを変更しています。

このプロセスを開始する前に、画像をロードしてマスクを表示し、完了後に非表示にしています。しかし、大きな画像を使用したにもかかわらず、モバイル デバイスまたはデスクトップ ブラウザーでこのローダーを見ることができません。

また、ブラウザが処理された画像のレンダリングを完了するまで、読み込み中の画像を表示したいと考えています。

前もって感謝します。

<!-- HTML Code -->
<div id="mask" class="newLoaderMask">
    <img src="http://jimpunk.net/Loading/wp-content/uploads/loading1.gif" width="200" id="loader" />
</div>
<input type="file" accept="image/*" id="takePictureField" />
<div class="captureInsuPanel">
    <img id="yourimage" class="imgWeightHght" width="500" />
</div>
<canvas id="hidden_canvas_old"></canvas>
<canvas id="hidden_canvas_new"></canvas>
<style>
#yourimage {
    width:100%;
}
.imgWeightHght {
    height: 290px !important;
    width: 220px !important;
}
.captureInsuPanel img {
    height: auto;
    width: auto;
}
.newLoaderMask {
    display: none;
    background: #E5E5E5;
    position: fixed;
    left: 0;
    top: 0;
    z-index: 10;
    width: 100%;
    height: 100%;
    opacity: 0.8;
    z-index: 999;
}
</style>

<script>
//Js Code 
$(document).ready(function () {
    $("#takePictureField").on("change", gotPic);
});

function gotPic(event) {
    if (event.target.files.length == 1 && event.target.files[0].type.indexOf("image/") == 0) {
        var image = event.target.files[0];
        $("#yourimage").attr("src", URL.createObjectURL(image));
        drawRotatedImage(image, 90, 800, 1000);
    }
}

function drawRotatedImage(image, angle, max_width, max_height) {
    //show loading mask
    $('#mask').show();
    var fileLoader = new FileReader(),
        imageObj = new Image();

    if (image.type.indexOf("image/") == 0) {
        fileLoader.readAsDataURL(image);
    } else {
        alert('File is not an image');
    }
    fileLoader.onload = function () {
        var data = this.result;
        imageObj.src = data;
    };

    fileLoader.onabort = function () {
        alert("The upload was aborted.");
    };

    fileLoader.onerror = function () {
        alert("An error occured while reading the file.");
    };


    // set up the images onload function which clears the hidden canvas context, 
    // draws the new image then gets the blob data from it
    imageObj.onload = function () {
        var imgWidth = this.width;
        var imgHeight = this.height;
        rotateAndResize(this, imgWidth, imgHeight);

    };

    function rotateAndResize(image, imgWidth, imgHeight) {
        var canvas = document.getElementById("hidden_canvas_old"),
            ctx = canvas.getContext("2d");

        var widthHalf = imgWidth / 2,
            heightHalf = imgHeight / 2;

        canvas.width = imgWidth;
        canvas.height = imgWidth;

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.save();
        ctx.translate(canvas.width / 2, canvas.height / 2);
        ctx.rotate(angle * Math.PI / 180);
        ctx.drawImage(image, -widthHalf, -widthHalf);

        ctx.restore();

        var tempCanvas = document.getElementById("hidden_canvas_new"),
            tCtx = tempCanvas.getContext("2d");

        tempCanvas.width = imgHeight;
        tempCanvas.height = imgWidth;
        /*
         * Crop rotated image from old canvas to remove white space 
         * So that canvas will have only image content without extra padding
         */
        tCtx.drawImage(canvas, canvas.width - imgHeight, 0, imgHeight, imgWidth, 0, 0, imgHeight, imgWidth);
        tCtx.restore();

        /**
         * Resizing Rotated image
         */
        // calculate the width and height, constraining the proportions
        if (imgWidth > imgHeight) {
            if (imgWidth > max_width) {
                imgHeight = Math.round(imgHeight *= max_width / imgWidth);
                imgWidth = max_width;
            }
        } else {
            if (imgWidth > max_height) {
                imgWidth = Math.round(imgWidth *= max_height / imgHeight);
                imgHeight = max_height;
            }
        }
        var tempCanvasTemp = tempCanvas;
        tempCanvas.remove();
        canvas.remove();

        var tempCanvas1 = document.createElement("canvas"),
            tCtx1 = tempCanvas1.getContext("2d");

        tempCanvas1.id = 'hidden_canvas_new';
        //tempCanvas1.style.display = 'none';
        tempCanvas1.width = imgHeight;
        tempCanvas1.height = imgWidth;

        tCtx1.drawImage(tempCanvasTemp, 0, 0, imgHeight, imgWidth);
        tCtx1.restore();

        document.body.appendChild(tempCanvas1);

        $("#yourimage").attr("src", tempCanvas1.toDataURL('image/jpeg'));
    }
    //hide loading mask
    $('#mask').hide();
}
</script>
4

1 に答える 1

2

ローディング div#maskdrawRotatedImage関数で非表示にしてrotateAndResizeいますが、画像をキャンバスに描画している関数で非表示にする必要があります。

コード:

$(document).ready(function () {
    $("#takePictureField").on("change", gotPic);
});

function gotPic(event) {
    if (event.target.files.length == 1 && event.target.files[0].type.indexOf("image/") == 0) {
        var image = event.target.files[0];
        $("#yourimage").attr("src", URL.createObjectURL(image));
        drawRotatedImage(image, 90, 800, 1000);
    }
}

function drawRotatedImage(image, angle, max_width, max_height) {
    $('#mask').show();
    var fileLoader = new FileReader(),
        imageObj = new Image();

    if (image.type.indexOf("image/") == 0) {
        fileLoader.readAsDataURL(image);
    } else {
        alert('File is not an image');
    }
    fileLoader.onload = function () {
        var data = this.result;
        imageObj.src = data;
    };

    fileLoader.onabort = function () {
        alert("The upload was aborted.");
    };

    fileLoader.onerror = function () {
        alert("An error occured while reading the file.");
    };


    // set up the images onload function which clears the hidden canvas context, 
    // draws the new image then gets the blob data from it
    imageObj.onload = function () {
        var imgWidth = this.width;
        var imgHeight = this.height;
        rotateAndResize(this, imgWidth, imgHeight);

    };

    function rotateAndResize(image, imgWidth, imgHeight) {
        var canvas = document.getElementById("hidden_canvas_old"),
            ctx = canvas.getContext("2d");

        var widthHalf = imgWidth / 2,
            heightHalf = imgHeight / 2;

        canvas.width = imgWidth;
        canvas.height = imgWidth;

        ctx.clearRect(0, 0, canvas.width, canvas.height);
        ctx.save();
        ctx.translate(canvas.width / 2, canvas.height / 2);
        ctx.rotate(angle * Math.PI / 180);
        ctx.drawImage(image, -widthHalf, -widthHalf);

        ctx.restore();

        var tempCanvas = document.getElementById("hidden_canvas_new"),
            tCtx = tempCanvas.getContext("2d");

        tempCanvas.width = imgHeight;
        tempCanvas.height = imgWidth;
        /*
         * Crop rotated image from old canvas to remove white space 
         * So that canvas will have only image content without extra padding
         */
        tCtx.drawImage(canvas, canvas.width - imgHeight, 0, imgHeight, imgWidth, 0, 0, imgHeight, imgWidth);
        tCtx.restore();

        /**
         * Resizing Rotated image
         */
        // calculate the width and height, constraining the proportions
        if (imgWidth > imgHeight) {
            if (imgWidth > max_width) {
                imgHeight = Math.round(imgHeight *= max_width / imgWidth);
                imgWidth = max_width;
            }
        } else {
            if (imgWidth > max_height) {
                imgWidth = Math.round(imgWidth *= max_height / imgHeight);
                imgHeight = max_height;
            }
        }
        var tempCanvasTemp = tempCanvas;
        tempCanvas.remove();
        canvas.remove();

        var tempCanvas1 = document.createElement("canvas"),
            tCtx1 = tempCanvas1.getContext("2d");

        tempCanvas1.id = 'hidden_canvas_new';
        //tempCanvas1.style.display = 'none';
        tempCanvas1.width = imgHeight;
        tempCanvas1.height = imgWidth;

        tCtx1.drawImage(tempCanvasTemp, 0, 0, imgHeight, imgWidth);
        tCtx1.restore();

        document.body.appendChild(tempCanvas1);

        $("#yourimage").attr("src", tempCanvas1.toDataURL('image/jpeg'));
         $('#mask').hide();
    }
}

DEMO FIDDLE

注:フィドルのテスト中にもう 1 つの問題が見つかりました。画像を 2 回目にアップロードしようとすると、新しい画像で更新されずに 2 番目のキャンバスになります。これに取り組む必要があることを願っています。

于 2013-09-01T20:34:45.093 に答える