Android-universal-image-loader: Bug de orientação EXIF

Criado em 4 mar. 2014  ·  37Comentários  ·  Fonte: nostra13/Android-Universal-Image-Loader

Olá,
Estou usando o UIL 1.9.1 em meu projeto recente. Percebi que o UIL agora oferece suporte à orientação EXIF https://github.com/nostra13/Android-Universal-Image-Loader/issues/172, mas encontrei um problema ao carregar fotos do cartão SD. No meu aplicativo, a imagem é girada 90 graus, mas na galeria do Android está tudo ok.

Telas:

Código:
ImageLoader.getInstance (). DisplayImage ("file: ///" + currentPhotoAbsolutePath, imageView, ImageLoaderOptions.GALLERY);

public static DisplayImageOptions GALLERY = new DisplayImageOptions.Builder ()
.cacheInMemory (verdadeiro)
.construir();

De acordo com https://github.com/nostra13/Android-Universal-Image-Loader/issues/172#issuecomment -17120841, deve funcionar porque estou carregando arquivos locais.

O problema ocorre em:

  • Samsung Galaxy S (Cyanogenmod 11)
  • Xperia s LT26i (Android 4.1.2)
Bug

Comentários muito úteis

Oi @Ziem
Eu considero que isso não é um problema. Você tentou definir considerExifParams (true) e cacheOnDisc (true) para seu DisplayImageOption que você usa no método ImageLoader.displayImage ()?

Todos 37 comentários

Oi @Ziem
Eu considero que isso não é um problema. Você tentou definir considerExifParams (true) e cacheOnDisc (true) para seu DisplayImageOption que você usa no método ImageLoader.displayImage ()?

Você está certo. Eu esqueci. considerExifParams (true) resolveu meu problema, obrigado.

Isso realmente me ajudou a resolver esse problema.

Muito obrigado. Esta é uma biblioteca realmente incrível.

hi : Usei o jar 1.9.2 e configurei considerExifParams (true) e cacheOnDisc (true), mas este problema também existe

@ carl1990 eu tenho o mesmo problema

Você pode fornecer o URL da imagem que é exibida incorretamente?

Desculpe! Estou em ambiente de debug uso intranet da empresa, so url vc nao consegue acessar.

antes está errado

    public static DisplayImageOptions getDefaultDisplayImageOptions(
            Context context) {
        return new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.ic_default)
                .showImageForEmptyUri(R.drawable.ic_default)
                .showImageOnFail(R.drawable.ic_default)
                .cacheInMemory(true)
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .displayer(
                        new RoundedBitmapDisplayer(context.getResources()
                                .getDimensionPixelSize(R.dimen.icon_rounded)))
                .build();
    }

depois está certo

    public static DisplayImageOptions getDefaultDisplayImageOptions(
            Context context) {
        return new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.ic_default)
                .showImageForEmptyUri(R.drawable.ic_default)
                .showImageOnFail(R.drawable.ic_default)
                .cacheInMemory(true)
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
                .cacheOnDisk(true)
                .considerExifParams(false)
                .displayer(
                        new RoundedBitmapDisplayer(context.getResources()
                                .getDimensionPixelSize(R.dimen.icon_rounded)))
                .build();
    }

Quando eu defino "considerExifParams (true)", a imagem exibida no telefone na direção errada. Mas quando eu abro os arquivos de cache do cartão SD e encontrei a imagem na direção certa, isso é realmente incrível.

Após várias tentativas, defini "considerExifParams (false)", a imagem exibida no telefone na direção certa.
notas:
(1) Meu programa configurou o telefone para forçar o retrato.
(2) Apenas algumas imagens foram exibidas na direção incorreta.
(3) Eu uso o jar versão 1.9.3.

@ihenk Testei seu link e percebi esse comportamento estranho. Parece que esta imagem é girada durante a decodificação em bitmap. Vou investigar este caso.

Eu enfrentei esse problema agora. Também tento considerExifParams em true e false mas a imagem ainda gira 90 graus.
Eu uso a versão 1.9.3. Aqui está minha configuração de imagem de exibição:

 mDisplayImageOptions = new DisplayImageOptions.Builder()
                .cacheInMemory(true)
                .imageScaleType(ImageScaleType.IN_SAMPLE_POWER_OF_2)
                .bitmapConfig(Bitmap.Config.ARGB_4444)
                .considerExifParams(false)
                .build();

Alguém pode me ajudar a apontar o problema aqui?

Eu também encontro o problema.
Estou criando um recurso de galeria, então preciso carregar imagens da MediaStore.
Os arquivos de imagem originais funcionam bem quando eu defino considerExifParams como true. (Caso contrário, ele girou incorretamente)

Mas quando eu uso MediaStore.Image.Thumbnail.Data, a imagem girada incorretamente, embora eu tenha definido considerExifParams como true.

Eu também configurei cacheOnDisk, mas não resolve o problema.

Para fazer galeria de imagens, estou usando o código abaixo para consultar o Media Store:
final String [] colunas = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID,
MediaStore.Images.Media.MIME_TYPE, MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.SIZE};
final String orderBy = MediaStore.Images.Media._ID;
Cursor imageCursor = managedQuery (
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, colunas,
null, null, orderBy);
if (imageCursor! = null && imageCursor.getCount ()> 0) {

                while (imageCursor.moveToNext()) {
                    CustomGalleryItem item = new CustomGalleryItem();

                    int dataColumnIndex = imageCursor
                            .getColumnIndex(MediaStore.Images.Media.DATA);

                    item.sdcardPath = imageCursor.getString(dataColumnIndex);

                    int mimeTypeColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media.MIME_TYPE);
                    item.mimeType = imageCursor.getString(mimeTypeColumnIndex);

                    int idColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media._ID);
                    item.id = imageCursor.getString(idColumnIndex);

                    int nameColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME);
                    item.fileName = imageCursor.getString(nameColumnIndex);

                    int sizeColumnIndex = imageCursor.getColumnIndex(MediaStore.Images.Media.SIZE);
                    item.fileSize = imageCursor.getString(sizeColumnIndex);

                    if(selectedList != null && selectedList.size() > 0) {
                        for(CustomGalleryItem selectedItem : selectedList) {
                            if(selectedItem.id.equals(item.id)) {
                                item.isSeleted = true;
                                break;
                            }
                        }
                    }
                    galleryList.add(item);
                }
            }

Para inicializar o Image Loader, usei o código abaixo:

DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder ()
.imageScaleType (ImageScaleType.EXACTLY_STRETCHED)
.bitmapConfig (Bitmap.Config.RGB_565)
.considerExifParams (true) .build ();
ImageDecoder smartUriDecoder = new SmartUriDecoder (this, getContentResolver (), new BaseImageDecoder (false));

    ImageLoaderConfiguration.Builder builder = new ImageLoaderConfiguration.Builder(
            this).defaultDisplayImageOptions(defaultOptions).memoryCache(
                    new WeakMemoryCache())
                    .imageDecoder(smartUriDecoder);

    ImageLoaderConfiguration config = builder.build();
    ImageLoader imageLoader = ImageLoader.getInstance();
    imageLoader.init(config);

Eu escrevi ImageDecoder personalizado porque o carregador de imagem universal funciona corretamente para mostrar a miniatura da imagem. Mas eu queria mostrar miniaturas para vídeos, áudios também.

Estou usando "universal-image-loader-1.9.2-SNAPSHOT-with-sources"

O mesmo problema para mim. Ambos
.considerExifParams (false)
e
.considerExifParams (true)

leva ao mesmo resultado - foto girada incorretamente para imagens feitas em retratos. A foto em paisagem é mostrada corretamente.

universal-image- loader: 1.9.4

Olá, enfrentei o problema no UIL V-1.9.4. Por favor, compartilhe as descobertas e corrija o bug. Acho que é um dos principais bugs desta biblioteca, pois eles ofereciam esse recurso com uma nota pesada.

Até que o problema seja resolvido, usei o Picasso. Ele resolve isso automaticamente.

@Cedriga O Picasso tem o mesmo problema no SAMSUNG NOTE III com android 4.4

Na verdade .considerExifParams (true) funciona para mim. No entanto, certifique-se de configurar as opções e passá-las ao ImageLoader em qualquer atividade em que você exiba imagens, Galeria, ImageDetail etc ... Aqui está o meu código:

DisplayImageOptions options = new DisplayImageOptions.Builder()
                .showImageOnLoading(R.drawable.blank)
                .showImageForEmptyUri(R.drawable.blank)
                .showImageOnFail(R.drawable.blank)
                .cacheInMemory(true)
                .cacheOnDisk(true)
                .considerExifParams(true)
                .bitmapConfig(Bitmap.Config.RGB_565)
                .build();

imageLoader.displayImage(GalleryActivity.mThumbIds[position] ,imageView, options);

Minha visualização de atividade está no modo paisagem.

Estou usando tudo, mas a imagem estática está definida para girar na visualização da imagem.

options = new DisplayImageOptions.Builder ()
.showImageOnLoading (android.R.color.white)
.showImageForEmptyUri (android.R.color.white)
.showImageOnFail (android.R.color.white)
.imageScaleType (ImageScaleType.EXACTLY)
.cacheInMemory (verdadeiro)
.cacheOnDisk (verdadeiro)
.considerExifParams (true)
.bitmapConfig (Bitmap.Config.RGB_565)
.construir();

O mesmo problema para mim. Ambos
.considerExifParams (false)
e
.considerExifParams (true)

É mais um problema de compatibilidade no KitKat, Lollipop, eu acho.
Aqui está outro tópico https://github.com/square/picasso/issues/579
Estou usando o Picasso e tendo esse problema.
Vou usar e ver se o UIL dá solução.

você precisa sobrescrever o BaseImageDecoder.class e sobrescrever o método canDefineExifParams, adicionar image / png mimetype, então tudo está ok

Isso está resolvido?

Desculpe, não...

------------------ A mensagem original ------------------
De: "Jorge Garrido" ; notificaçõ[email protected];
Prazo de entrega: 1º de abril de 2016 (sexta-feira) 15:22
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];

Assunto: Re: [nostra13 / Android-Universal-Image-Loader] Bug de orientação EXIF ​​(# 559)

Isso está resolvido?

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub

Eu entendi o motivo, é por causa do mimeType no método canDefineExifParams (String imageUri, String mimeType) da classe BaseImageDecoder, você deve adicionar "image / png" neste método.
Eu fiz assim e funciona.

在 2016-04-01 15:25:18 , "dylan" [email protected]写道 :
Desculpe, não...

------------------ 原始 邮件 ------------------
发件人: "Jorge Garrido" ; notificaçõ[email protected];
发送 时间: 2016 年 4 月 1 日 (星期五) 下午 3:22
收件人: "nostra13 / Android-Universal-Image-Loader" [email protected];

主题: Re: [nostra13 / Android-Universal-Image-Loader] Bug de orientação EXIF ​​(# 559)

Isso está resolvido?

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub

-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente ou visualize-o no GitHub

Algum código de amostra @ rx123rx ?

obrigado, eu tento mais tarde ...

------------------ A mensagem original ------------------
De: "Monkey.D.Ren" ; [email protected];
Prazo de entrega: 1º de abril de 2016 (sexta-feira) 15:42
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];
Cc: "kevin" [email protected];
Assunto: Re: [nostra13 / Android-Universal-Image-Loader] Bug de orientação EXIF ​​(# 559)

Eu entendi o motivo, é por causa do mimeType no método canDefineExifParams (String imageUri, String mimeType) da classe BaseImageDecoder, você deve adicionar "image / png" neste método.
Eu fiz assim e funciona.

Em 2016-04-01 15:25:18, "dylan" [email protected] escreveu:
Desculpe, não...

------------------ A mensagem original ------------------
De: "Jorge Garrido" ; notificaçõ[email protected];
Prazo de entrega: 1º de abril de 2016 (sexta-feira) 15:22
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];

Assunto: Re: [nostra13 / Android-Universal-Image-Loader] Bug de orientação EXIF ​​(# 559)

Isso está resolvido?

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub

-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente ou visualize-o no GitHub
-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente ou visualize-o no GitHub

private boolean canDefineExifParams (String imageUri, String mimeType) {
if (mimeType == null) {
retorna falso;
}
return ("image / jpeg" .equalsIgnoreCase (mimeType) || "image / png" .equalsIgnoreCase (mimeType)) && (Scheme.ofUri (imageUri) == Scheme.FILE);
}

porque o sufixo das imagens no cache é .png, eu apenas substituo esse método assim.

在 2016-04-01 15:44:36 , "Jorge Garrido" [email protected]写道 :

Algum código de amostra @ rx123rx ?

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente ou visualize-o no GitHub

ha ha, obrigado, posso anotar suas informações de contato?

------------------ 原始 邮件 ------------------
发件人: "Monkey.D.Ren" ; [email protected];
发送 时间: 2016 年 4 月 1 日 (星期五) 下午 3:52
收件人: "nostra13 / Android-Universal-Image-Loader" [email protected];
抄送: "kevin" [email protected];
主题: Re: [nostra13 / Android-Universal-Image-Loader] Bug de orientação EXIF ​​(# 559)

private boolean canDefineExifParams (String imageUri, String mimeType) {
if (mimeType == null) {
retorna falso;
}
return ("image / jpeg" .equalsIgnoreCase (mimeType) || "image / png" .equalsIgnoreCase (mimeType)) && (Scheme.ofUri (imageUri) == Scheme.FILE);
}

porque o sufixo das imagens no cache é .png, eu apenas substituo esse método assim.

在 2016-04-01 15:44:36 , "Jorge Garrido" [email protected]写道 :

Algum código de amostra @ rx123rx ?

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente ou visualize-o no GitHub
-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente ou visualize-o no GitHub

funciona?

Em 2016-04-01 15:45:42, "dylan" [email protected] escreveu:
obrigado, eu tento mais tarde ...

------------------ A mensagem original ------------------
De: "Monkey.D.Ren" ; [email protected];
Prazo de entrega: 1º de abril de 2016 (sexta-feira) 15:42
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];
Cc: "kevin" [email protected];
Assunto: Re: [nostra13 / Android-Universal-Image-Loader] Bug de orientação EXIF ​​(# 559)

Eu entendi o motivo, é por causa do mimeType no método canDefineExifParams (String imageUri, String mimeType) da classe BaseImageDecoder, você deve adicionar "image / png" neste método.
Eu fiz assim e funciona.

Em 2016-04-01 15:25:18, "dylan" [email protected] escreveu:
Desculpe, não...

------------------ A mensagem original ------------------
De: "Jorge Garrido" ; notificaçõ[email protected];
Prazo de entrega: 1º de abril de 2016 (sexta-feira) 15:22
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];

Assunto: Re: [nostra13 / Android-Universal-Image-Loader] Bug de orientação EXIF ​​(# 559)

Isso está resolvido?

-
Você está recebendo isto porque está inscrito neste tópico.
Responda a este e-mail diretamente ou visualize-o no GitHub

-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente ou visualize-o no GitHub
-
Você está recebendo isso porque comentou.
Responda a este e-mail diretamente ou visualize-o no GitHub

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente ou visualize-o no GitHub

@ rx123rx parece funcionar em dispositivos Samsung ... mas a Sony falha

Acho que vc pode assistir o logcat, dê uma olhada que tipo de sufixo das imagens no cache e adicione esse tipo de mimeType nesse método.
Talvez funcione.boa sorte!

在 2016-04-01 17:51:02 , "Jorge Garrido" [email protected]写道 :

@ rx123rx parece funcionar em dispositivos Samsung ... mas a Sony falha

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente ou visualize-o no GitHub

E funciona no meu HTC M8.

在 2016-04-01 17:51:02 , "Jorge Garrido" [email protected]写道 :

@ rx123rx parece funcionar em dispositivos Samsung ... mas a Sony falha

-
Você está recebendo isso porque foi mencionado.
Responda a este e-mail diretamente ou visualize-o no GitHub

@ nostra13 : Tentei esta seção de lógica e funciona no meu caso.

http://stackoverflow.com/a/39226824/2382964

Acabei de enfrentar o mesmo problema em dispositivos Samsung, mas considerExifParams (true) apenas resolveu.

Olá ,

Estou usando este carregador universal de imagens para armazenar imagens em cache.
Mas quando recebi a imagem, estou adicionando a criptografia no arquivo e descriptografando enquanto a decodificação é chamada.
Estou enfrentando problemas com dispositivos Samsung, pois minha imagem é girada.
o parâmetro exif não está sendo aplicado no momento. por favor ajude se alguém corrigiu este problema.

meu código é:
Para criptografia é
`@Override
salvamento booleano público (String imageUri, InputStream imageDataStream, ouvinte IoUtils.CopyListener) throws IOException {

    InputStream imageStream = EncryptionHandler.getSecureInputStream(imageDataStream, EncryptionHandler.MODE_ENCRYPT, ImageDbEncryptionAlgo.getInstance());
    File imageFile = getFile(imageUri);
    File tmpFile = new File(imageFile.getAbsolutePath() + TEMP_IMAGE_POSTFIX);
     boolean loaded = false;
    try {
        OutputStream os = new BufferedOutputStream(new FileOutputStream(tmpFile), bufferSize);
        try {
            loaded = IoUtils.copyStream(imageStream, os, listener, bufferSize);
          } finally {
            IoUtils.closeSilently(os);
        }
    } finally {
        if (loaded && !tmpFile.renameTo(imageFile)) {
            loaded = false;
        }
           if (!loaded) {
            tmpFile.delete();
        }
        if(imageStream !=null){
            IoUtils.closeSilently(imageStream);
        }
        if(imageDataStream !=null){
            IoUtils.closeSilently(imageDataStream);
        }
        imageStream =null;
        imageDataStream =null;
    }
    return loaded;
}

`` <strong i="16">@Override</strong> public boolean save(String imageUri, Bitmap bitmap) throws IOException { File imageFile = getFile(imageUri); File tmpFile = new File(imageFile.getAbsolutePath() + TEMP_IMAGE_POSTFIX); OutputStream os = new BufferedOutputStream(new FileOutputStream(tmpFile), bufferSize); boolean savedSuccessfully = false; try { savedSuccessfully = EncryptionHandler.encryptBitmap(bitmap, tmpFile.getAbsolutePath(),ImageDbEncryptionAlgo.getInstance()); } finally { IoUtils.closeSilently(os); if (savedSuccessfully && !tmpFile.renameTo(imageFile)) { savedSuccessfully = false; } if (!savedSuccessfully) { tmpFile.delete(); } } bitmap.recycle(); return savedSuccessfully; }

For decryption code is : 

decodificação de bitmap público (ImageDecodingInfo decodingInfo) lança IOException {
Bitmap decodedBitmap;
ImageFileInfo imageInfo;
InputStream decryptedStream = null;
InputStream imageStream = getImageStream (decodingInfo);
if (imageStream == null) {
Le ("Erro no fluxo de imagem", decodingInfo.getImageKey ());
return null;
}
tentar {
String imageKey = decodingInfo.getImageUri ();

        boolean isLocalImage= isLocalCachedFile(imageKey);
        if (isLocalImage) {
            decryptedStream = EncryptionHandler.getSecureInputStream(imageStream, EncryptionHandler.MODE_DECRYPT, ImageDbEncryptionAlgo.getInstance());
        } else {
            decryptedStream = imageStream;
        }


        imageInfo = defineImageSizeAndRotation(decryptedStream, decodingInfo);

        decryptedStream = resetStream(decryptedStream, decodingInfo);

        BitmapFactory.Options decodingOptions = prepareDecodingOptions(imageInfo.imageSize, decodingInfo);
        decodedBitmap = BitmapFactory.decodeStream(decryptedStream, null, decodingOptions);
    } finally {
        IoUtils.closeSilently(decryptedStream);
        IoUtils.closeSilently(imageStream);
    }

    if (decodedBitmap == null) {
        L.e(ERROR_CANT_DECODE_IMAGE, decodingInfo.getImageKey());
    } else {
        decodedBitmap = considerExactScaleAndOrientatiton(decodedBitmap, decodingInfo, imageInfo.exif.rotation,
                imageInfo.exif.flipHorizontal);
    }
            return decodedBitmap;
}

`` `

Eu usei isso; -
DisplayImageOptions options = new DisplayImageOptions.Builder ()
.cacheInMemory (verdadeiro)
.cacheOnDisk (verdadeiro)
.displayer (novo SimpleBitmapDisplayer ())
.resetViewBeforeLoading (true)
.considerExifParams (true)
.construir();

considerExifParams (true) funcionou para mim.

Esta página foi útil?
0 / 5 - 0 avaliações