画像の適切なプレビューを表示するために画像の向きを調整するにはどうすればよいですか?


8

ここに画像の説明を入力してくださいここに画像の説明を入力してくださいここに画像の説明を入力してくださいユーザーがアップロードした画像を受け付けて表示する機能を備えたララベルウェブアプリを開発しました。テスト中に問題が発生しました。携帯電話を使用してアップロードした写真が反時計回りに90度回転していたため、画像の介入を使用してその問題を解決しました。しかし、アップロードした画像のプレビューをJavaScriptを使用してユーザーに表示しているので、画像は90度回転しますが、画像を保存すると適切になります。私のJavaScriptコードは

    function imagePreview(input,elm) {
        if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                $(elm).css("background-image","url('"+e.target.result+"')");
            }
            reader.readAsDataURL(input.files[0]);
        }
    }
    $("#settings_img").on("change",function(){
        imagePreview(this,"#settings_img_elm");
    });

上記のコードを編集して、必要に応じて画像の向きを変更できるようにして、プレビュー画像の向きを適切に設定してください。


これはあなたの質問に答えますか?JSクライアント側のExif方向:JPEG画像の回転とミラー
Nick

私はそれらのコードを試しましたが、適切な出力を取得できませんでした。Web開発の新人です。そのため、誰かにコードを編集してもらいたいです@ニック
ジェフリンホセ

回答:


4

CSSで画像を回転させるだけではどうですか?

reader.onload = function (e) {
    $(elm).css({
        "background-image":"url('"+e.target.result+"')",
        "transform": "rotate(90deg)"
    });
}

編集:まあ、EXIFデータの世界に簡単に飛び込んだ後、私はあなたのための解決策があるかもしれないと思います。@Nickが示唆したように、AliのgetOrientation()関数を借りて、CSSで向きを次のように修正しました。

function correctOrientation(element, orientation){
    switch (orientation) {
      case 2: $(element).css("transform", "scaleX(-1)");
        break;
      case 3: $(element).css("transform", "rotate(180deg)");
        break;
      case 4: $(element).css("transform", "rotate(180deg) scaleX(-1)");
        break;
      case 5: $(element).css("transform", "rotate(-90deg) scaleX(-1)");
        break;
      case 6: $(element).css("transform", "rotate(90deg)");
        break;
      case 7: $(element).css("transform", "rotate(90deg) scaleX(-1)");
        break;
      case 8: $(element).css("transform", "rotate(-90deg)");
        break;
      default: break;
    }
}

バイオリン

それをテストするためのサンプルファイルが必要な場合は、ここから入手してください


編集:アップロードされた画像を<img>divのbackground-imageの代わりに配置する:https : //jsfiddle.net/ynzvtLe2/2/


これの問題は、適切な方向で画像をプレビューする電話があるため、css回転がそれらの画像を混乱させる@thingEvery
Jeffrin Jose

わかりました、私は私の答えを編集しました。ぜひお試しください。

私はこれを自分のコードにどのように配置するかを知りたいだけです。この分野で初めてです。質問の上記のコードにこのコードを入れてください
Jeffrin Jose

@JeffrinJoseええ、仲間。私はそうしました。ただ、ここに行くjsfiddle.net/n5sm7ucf/1とJavaScriptボックスからすべてをコピーします。(JSコードをそれで置き換えてください。)ああ、CSSも必要になります。ただし、「imagePreview」関数で行ったのと同じように、本当に必要な場合は、jQueryを使用してプログラムで追加できます。
ThingEvery

@JeffrinJoseあなたがまだ行き詰まっているなら、@私。
ThingEvery

2

これはうまくいくはずです。ここでは、画像ファイルの元の向きを取得し、適切な回転補正を使用してキャンバスを作成します。次に、正しく回転した画像をプレビューとして設定します。

function imagePreview(input,elm) {
    // image file
    var file = input.files[0]; 

    if (!file.type.match('image/jpeg.*')) {
        // image is not a jpeg, do something?
    }

    var reader = new FileReader();
    reader.onload = function(e) {
        var exif = piexif.load(e.target.result);
        var image = new Image();
        image.onload = function () {
            //get original orientation of the uploaded image
            var orientation = exif["0th"][piexif.ImageIFD.Orientation];

            // Build a temperory canvas to manipulate image to required orientation
            var canvas = document.createElement("canvas");
            canvas.width = image.width;
            canvas.height = image.height;
            var ctx = canvas.getContext("2d");
            var x = 0;
            var y = 0;
            ctx.save();
            if (orientation == 2) {
                x = -canvas.width;
                ctx.scale(-1, 1);
            } else if (orientation == 3) {
                x = -canvas.width;
                y = -canvas.height;
                ctx.scale(-1, -1);
            } else if (orientation == 4) {
                y = -canvas.height;
                ctx.scale(1, -1);
            } else if (orientation == 5) {
                canvas.width = image.height;
                canvas.height = image.width;
                ctx.translate(canvas.width, canvas.height / canvas.width);
                ctx.rotate(Math.PI / 2);
                y = -canvas.width;
                ctx.scale(1, -1);
            } else if (orientation == 6) {
                canvas.width = image.height;
                canvas.height = image.width;
                ctx.translate(canvas.width, canvas.height / canvas.width);
                ctx.rotate(Math.PI / 2);
            } else if (orientation == 7) {
                canvas.width = image.height;
                canvas.height = image.width;
                ctx.translate(canvas.width, canvas.height / canvas.width);
                ctx.rotate(Math.PI / 2);
                x = -canvas.height;
                ctx.scale(-1, 1);
            } else if (orientation == 8) {
                canvas.width = image.height;
                canvas.height = image.width;
                ctx.translate(canvas.width, canvas.height / canvas.width);
                ctx.rotate(Math.PI / 2);
                x = -canvas.height;
                y = -canvas.width;
                ctx.scale(-1, -1);
            }
            ctx.drawImage(image, x, y);
            ctx.restore();

            var dataURL = canvas.toDataURL("image/jpeg", 1.0);

            // set the preview image to your element
            $(elm).css("background-image","url('"+dataURL+"')");
        };
        image.src = e.target.result;
    };

    reader.readAsDataURL(file);

}


$("#settings_img").on("change",function(){
    imagePreview(this,"#settings_img_elm");
});

最初にこのライブラリを必ず含めて くださいhttps : //github.com/hMatoba/piexifjs

ドキュメントから助けを得ました: https //readthedocs.org/projects/piexif/downloads/pdf/latest/


上記のコードの代わりにJavaScriptファイルでこのコードを置き換えると、すべてが正しく機能しますか?
ジェフリンホセ

1
@Jeffrin Joseはい。試してみてください
Sapnesh Naik

試しましたが、プレビュー画像が表示されないだけです
Jeffrin Jose

これに影響を与えるしなければならない他の要因があります
Jeffrinホセ

@JeffrinJoseライブラリを適切に含めましたか?
Sapnesh Naik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.