Imagem em GraphicImagem é exibida invertida

2 respostas
java
K

Boa noite.

Estou desenvolvendo um sistema em JSF2 e nele eu utilizo um componente GraphicImage. Funciona perfeitamente com upload etc… Mas estou tendo o seguinte problema, quando se tira uma foto com a máquina fotografica deitada ou invertida mesmo que na pasta do windows ela seja visualizada da forma correta acontece que quando faço o upload no sistema ela é visualizada da forma invertida por exemplo se foi tirada com a máquina de lado ela é visualizada de lado. Acho estranho, alguém conhece uma forma de resolver isso?

2 Respostas

T

Uma possibilidade: o Windows (pelo menos o 7) gira a visualização da imagem de acordo com as informações de orientação da foto tirada (essas informações ficam dentro do próprio arquivo jpeg). Então, quando você olha pelo Windows Explorer, parece que a foto está “certa” (ou seja, uma foto tirada de lado aparece como girada 90 graus). Entretanto, a foto está mesmo girada, e qualquer visualizador de imagem irá exibi-la de lado. Quando você faz o upload, o navegador (que exibe o GraphicImage) exibe a foto do jeito que foi tirada (ou seja, de lado).

Uma opção é, ao terminar o upload, permitir o usuário ver a foto e girá-la antes de salvá-la, similar ao que faz o Facebook. Daí você grava a imagem alterada. Deve haver bibliotecas que facilitem essa ação, ou mesmo usando um BufferedImage (que já existe no Java) e um algoritmo simples de rotacionamento.

Abraço.

K

Obrigado TerraSkill por sua ajuda. Tentei fazer assim mas a imagem continua invertida e também recebo o erro:

java.io.IOException: java.io.IOException: Stream Closed

ManagedBean:

public void doUpload(FileUploadEvent event) { 
            try {
                imagem = new DefaultStreamedContent(event.getFile().getInputstream());
                this.setFile(event.getFile());        
                
            } catch (IOException e) {
                //Tratamento de exceção
            }

        }

public String upload() throws IOException {
        diretorio = diretorio();
        aleatorio = aleatorio();
        
        new File("D:\\sigcm\\galeria\\imagens\\" + this.diretorio + this.aleatorio).mkdir();
        
        UploadedFile uf = this.getFile();
        File f = new File("D:\\sigcm\\galeria\\imagens\\" + this.diretorio + this.aleatorio + "\\",
                this.aleatorio + uf.getFileName());
        InputStream is = uf.getInputstream();// retorna um InputStream
        byte[] b = new byte[is.available()];
        OutputStream os = new FileOutputStream(f);
        while (is.read(b) > 0) {
            os.write(b);
        }
        os.flush();
        os.close();
        is.close();
        
        FacesMessage msg = new FacesMessage("Upload realizado com Sucesso!", uf.getFileName());
        FacesContext.getCurrentInstance().addMessage(null, msg);
        
        return uf.getFileName();
    }

index.xhtml:

<p:commandButton icon="ui-icon-arrowreturnthick-1-w"
        value="Girar a esquerda"
        onclick="PF('rotateAndResizeWidget').rotateLeft(90);
        return false;" />

<h:panelGroup id="companyImage">
    <p:graphicImage value="#{pessoaCadastroBean.imagem}" id="imagem"
        style="max-width: 100px; max-height: 100px;"
        cache="false" rendered="#{pessoaCadastroBean.imagem != null}" />
    <pe:imageRotateAndResize id="rotateAndResize" for="imagem"
        widgetVar="rotateAndResizeWidget" />
</h:panelGroup>

<p:fileUpload value="#{pessoaCadastroBean.file}"
    label="Procurar..."
    multiple="false"
    fileUploadListener="#{pessoaCadastroBean.doUpload}" auto="true"
    showButtons="false" update="companyImage" />

<p:commandButton value="Salvar"
    action="#{pessoaCadastroBean.salvar}" ajax="false"
    disable="false" actionListener="#{pessoaCadastroBean.upload}"
    icon="ui-icon-disk" update="@all">

    <f:setPropertyActionListener value="#{pessoaCadastroBean.arquivo}"
        target="#{pessoaCadastroBean.pessoa.url}" />
</p:commandButton>

Alguém teria uma idéia de como resolver?

Criado 16 de outubro de 2016
Ultima resposta 19 de out. de 2016
Respostas 2
Participantes 2