Làm cách nào để điều chỉnh hướng của hình ảnh để hiển thị chế độ xem trước phù hợp của hình ảnh?


8

nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đâyTôi đã phát triển một ứng dụng web laravel có chức năng chấp nhận hình ảnh được tải lên bởi người dùng và sau đó hiển thị nó. Tôi đã gặp phải một vấn đề trong khi thử nghiệm khi các bức ảnh được tải lên bằng điện thoại di động đang xoay 90 độ theo hướng chống đồng hồ thông minh, tôi đã sử dụng can thiệp hình ảnh để giải quyết vấn đề đó. Nhưng khi tôi hiển thị bản xem trước của hình ảnh được tải lên cho người dùng bằng cách sử dụng javascript, hình ảnh được xoay 90 độ nhưng khi tôi lưu hình ảnh thì nó trở nên phù hợp. Mã javascript của tôi là

    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");
    });

bất cứ ai có thể xin vui lòng giúp tôi định hướng đúng hình ảnh xem trước bằng cách chỉnh sửa mã ở trên để hướng của hình ảnh thay đổi khi cần thiết.


Điều này có trả lời câu hỏi của bạn không? Định hướng Exif phía máy khách: Xoay và phản chiếu hình ảnh JPEG
Nick

Tôi đã thử các mã đó nhưng tôi không thể có được đầu ra thích hợp. Tôi là người mới trong phát triển web và do đó tôi muốn ai đó chỉnh sửa mã cho mình @ Nick
Jeffrin Jose

Câu trả lời:


4

Làm thế nào về việc chỉ xoay hình ảnh với CSS?

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

Chỉnh sửa: Chà, sau một thời gian ngắn đi sâu vào thế giới dữ liệu EXIF, tôi nghĩ rằng tôi có thể có một giải pháp cho bạn. Tôi đã mượn hàm getOrientation () của Ali , như @Nick đề xuất, và sau đó tôi chỉ sửa hướng bằng CSS như sau:

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;
    }
}

vĩ cầm

Và nếu bạn cần các tệp ví dụ để kiểm tra nó, hãy lấy chúng ở đây .


Chỉnh sửa: Đặt hình ảnh được tải lên <img>thay vì hình nền của div: https://jsfiddle.net/ynzvtLe2/2/


Vấn đề với điều này là có những chiếc điện thoại xem trước hình ảnh với định hướng phù hợp, do đó, xoay css sẽ gây rối với những hình ảnh đó @ thingEvery
Jeffrin Jose

Ok, tôi đã chỉnh sửa câu trả lời của mình. Hãy thử xem.
thingEvery

Tôi chỉ muốn biết làm thế nào để đặt mã này vào mã của tôi Tôi là người mới trong lĩnh vực này, bạn có thể vui lòng đặt mã này vào mã đã cho ở trên trong câu hỏi
Jeffrin Jose

@JeffrinJose Vâng, anh bạn. Tôi đã làm điều đó. Chỉ cần vào đây jsfiddle.net/n5sm7ucf/1 và sao chép mọi thứ từ hộp javascript. (Thay thế mã JS của bạn bằng mã đó.) Ồ, bạn cũng sẽ cần CSS. Mặc dù, bạn có thể sử dụng jQuery để thêm chương trình đó nếu bạn thực sự muốn, giống như bạn đã làm trong chức năng 'imagePreview' của mình.
điều

@JeffrinJose Nếu bạn vẫn bị mắc kẹt, @ tôi.
điềuEvery

2

Điều này nên làm việc. Ở đây tôi có được hướng ban đầu của tệp hình ảnh và sau đó xây dựng một khung vẽ với hiệu chỉnh xoay phù hợp. Sau đó chúng tôi đặt hình ảnh xoay chính xác làm bản xem trước.

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");
});

Đảm bảo bao gồm thư viện này trước: https://github.com/hMatoba/piexifjs

Tôi đã nhận được sự giúp đỡ từ tài liệu: https://readthedocs.org/projects/piexif/doads/pdf/latest/


Nếu tôi thay thế mã này trong tệp javascript của mình thay cho mã đã cho ở trên thì mọi thứ sẽ hoạt động bình thường chứ ???
Jeffrin Jose

1
@Jeffrin Jose Có. Vui lòng thử điều đó
Sapnesh Naik

tôi đã thử nhưng hình ảnh xem trước chỉ không thể tin được
Jeffrin Jose

Có yếu tố nào khác phải ảnh hưởng đến điều này không
Jeffrin Jose

@JeffrinJose bạn đã bao gồm thư viện đúng cách chưa?
Sapnesh Naik
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.