Como ajustar a orientação de uma imagem para mostrar a visualização adequada da imagem?


8

insira a descrição da imagem aquiinsira a descrição da imagem aquiinsira a descrição da imagem aquiEu desenvolvi um aplicativo da web laravel que tem a função de aceitar imagens enviadas pelos usuários e depois exibi-las. Eu havia encontrado um problema durante o teste, pois as fotos carregadas usando telefones celulares giravam 90 graus no sentido anti-horário. Usei a intervenção de imagem para resolver esse problema. Mas como eu estou mostrando uma visualização da imagem carregada para os usuários usando javascript, as imagens são giradas 90 graus, mas quando eu salvo a imagem, ela se torna adequada. Meu código 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");
    });

alguém pode me ajudar a orientar adequadamente a imagem de visualização editando o código acima para que a orientação da imagem seja alterada quando necessário.



i tentou esses códigos, mas eu não poderia obter uma saída adequada eu sou novo em desenvolvimento web e, portanto, eu quero alguém para editar meu código para mim @ Nick
Jeffrin Jose

Respostas:


4

Que tal apenas girar a imagem com CSS?

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

Edit: Bem, depois de um breve mergulho no mundo dos dados EXIF, acho que posso ter uma solução para você. Peguei emprestada a função getOrientation () de Ali , como sugeriu o @Nick, e corrigi a orientação com CSS da seguinte maneira:

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

violino

E se você precisar de arquivos de exemplo para testá-lo, obtenha-os aqui .


Edit: Posicionando a imagem carregada em uma imagem <img>de fundo da div: https://jsfiddle.net/ynzvtLe2/2/


o problema com isto é que existem telefones que inspeciona imagem com orientação adequada, portanto, css girar irá mexer com essas imagens @ thingEvery
Jeffrin Jose

Ok, eu editei minha resposta. Por favor, tente.
thingEvery

Eu só quero saber como colocar isso no meu código eu sou novo neste campo poderia u por favor, coloque este código no código acima dada na questão
Jeffrin Jose

@JeffrinJose Yeah, mano. Eu fiz isso. Basta ir aqui jsfiddle.net/n5sm7ucf/1 e copiar tudo da caixa javascript. (Substitua seu código JS por isso.) Ah, você também precisará do CSS. No entanto, você pode usar o jQuery para adicionar isso de forma programática, se realmente quiser, assim como fez na função 'imagePreview'.
thingEvery

@JeffrinJose Se você ainda está preso, @ eu.
thingEvery

2

Isso deve funcionar. Aqui, obtenho a orientação original do arquivo de imagem e, em seguida, construo uma tela com a correção de rotação apropriada. Em seguida, definimos a imagem girada corretamente como visualização.

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

Certifique-se de incluir esta biblioteca primeiro: https://github.com/hMatoba/piexifjs

Eu recebi ajuda da documentação: https://readthedocs.org/projects/piexif/downloads/pdf/latest/


se eu substituir esse código no meu arquivo javascript no lugar do código acima, tudo funcionará corretamente ???
Jeffrin Jose

1
@Jeffrin Jose Sim. Por favor, tente isso
Sapnesh Naik 29/12/19

Eu tentei, mas a imagem de visualização só não é vissible
Jeffrin Jose

existe algum outro fator que deve estar afetando isso
Jeffrin Jose 29/12/19

@JeffrinJose você incluiu a biblioteca corretamente?
Sapnesh Naik
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.