Android-universal-image-loader: Error de orientación EXIF

Creado en 4 mar. 2014  ·  37Comentarios  ·  Fuente: nostra13/Android-Universal-Image-Loader

Hola,
Estoy usando UIL 1.9.1 en mi proyecto reciente. Vi que UIL ahora admite la orientación EXIF https://github.com/nostra13/Android-Universal-Image-Loader/issues/172 pero encontré un problema al cargar fotos desde la tarjeta SD. En mi aplicación, la imagen se gira 90 grados, pero en la galería de Android todo está bien.

Pantallas:

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

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

Según https://github.com/nostra13/Android-Universal-Image-Loader/issues/172#issuecomment -17120841 debería funcionar porque estoy cargando archivos locales.

El problema ocurre en:

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

Comentario más útil

Hola, @Ziem
Considero que esto no es un problema. ¿Ha intentado establecer considerExifParams (true) y cacheOnDisc (true) en su DisplayImageOption que utiliza en el método ImageLoader.displayImage ()?

Todos 37 comentarios

Hola, @Ziem
Considero que esto no es un problema. ¿Ha intentado establecer considerExifParams (true) y cacheOnDisc (true) en su DisplayImageOption que utiliza en el método ImageLoader.displayImage ()?

Tienes razón. Lo pasé por alto. considerExifParams (true) resolvió mi problema, gracias.

Realmente me ayudó a resolver este problema.

Muchas gracias. Esta es una biblioteca realmente impresionante.

hola : Usé el jar 1.9.2 y configuré considerExifParams (verdadero) y cacheOnDisc (verdadero) pero este problema también existe

@ carl1990 tengo el mismo problema

¿Puede proporcionar la URL de la imagen que se muestra incorrectamente?

¡lo siento! Estoy en un entorno de depuración, uso la intranet de la empresa, por lo que no puede acceder a la URL a la que no puede acceder.

antes esta mal

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

después es correcto

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

Cuando configuro "considerExifParams (true)", la imagen se muestra en el teléfono en la dirección incorrecta. Pero cuando abro los archivos de caché de la tarjeta SD y encontré la imagen en la dirección correcta, esto es realmente increíble.

Después de varios intentos, configuré "considerExifParams (false)", la imagen que se muestra en el teléfono en la dirección correcta.
notas:
(1) Mi programa configuró el teléfono para forzar el retrato.
(2) Solo unas pocas imágenes se muestran en la dirección incorrecta.
(3) Yo uso la versión jar 1.9.3.

@ihenk Probé tu enlace y me di cuenta de este comportamiento extraño. Parece que esta imagen se gira durante la decodificación en mapa de bits. Investigaré este caso.

Enfrenté este problema ahora. También pruebo considerExifParams tanto en true como en false pero la imagen aún gira 90 grados.
Yo uso la versión 1.9.3. Aquí está mi configuración de imagen de pantalla:

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

¿Alguien puede ayudarme a señalar el problema aquí?

También me encuentro con el problema.
Estoy creando una función de galería, así que necesito cargar imágenes desde MediaStore.
Los archivos de imagen originales funcionan bien cuando configuro considerExifParams en verdadero (de lo contrario, rotó incorrectamente)

Pero cuando uso MediaStore.Image.Thumbnail.Data, la imagen giró incorrectamente a pesar de que configuré considerExifParams en verdadero.

También configuré cacheOnDisk, pero no resuelve el problema.

Para hacer una galería de imágenes, estoy usando el siguiente código para consultar Media Store:
Cadena final [] columnas = {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, columnas,
nulo, nulo, 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 Image Loader, he usado el siguiente código:

DisplayImageOptions defaultOptions = nuevo DisplayImageOptions.Builder ()
.imageScaleType (ImageScaleType.EXACTLY_STRETCHED)
.bitmapConfig (mapa de bits.Config.RGB_565)
.considerExifParams (verdadero) .build ();
ImageDecoder smartUriDecoder = nuevo SmartUriDecoder (esto, getContentResolver (), nuevo BaseImageDecoder (falso));

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

He escrito ImageDecoder personalizado porque el cargador de imágenes universal funciona correctamente para mostrar la miniatura de la imagen. Pero quería mostrar miniaturas para videos, audios también.

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

El mismo problema para mí. Ambas cosas
.considerExifParams (falso)
y
.considerExifParams (verdadero)

conduce al mismo resultado: foto no girada correctamente para imágenes de retrato. La foto del paisaje se muestra correctamente.

cargador de imágenes universal

Hola, enfrenté el problema en UIL V-1.9.4. Por favor, comparta los hallazgos y corrija el error. Creo que es uno de los principales errores de esta biblioteca, ya que ofrecían esa función con una nota pesada.

Hasta que se solucione el problema, usé Picasso. Automáticamente resuelve esto.

@Cedriga El Picasso tiene el mismo problema en SAMSUNG NOTE III con android 4.4

En realidad .considerExifParams (verdadero) funciona para mí. Sin embargo, asegúrese de configurar las opciones y pasarlas a ImageLoader en cualquier actividad en la que muestre imágenes, Galería, ImageDetail, etc. Aquí está mi 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);

Mi vista de actividad está en modo horizontal.

Estoy usando todo, pero la imagen fija está configurada para rotar en la vista de imagen.

opciones = nuevo DisplayImageOptions.Builder ()
.showImageOnLoading (android.R.color.white)
.showImageForEmptyUri (android.R.color.white)
.showImageOnFail (android.R.color.white)
.imageScaleType (ImageScaleType.EXACTLY)
.cacheInMemory (verdadero)
.cacheOnDisk (verdadero)
.considerExifParams (verdadero)
.bitmapConfig (mapa de bits.Config.RGB_565)
.construir();

El mismo problema para mí. Ambas cosas
.considerExifParams (falso)
y
.considerExifParams (verdadero)

Es más un problema de compatibilidad en KitKat, creo que Lollipop.
Aquí hay otro hilo https://github.com/square/picasso/issues/579
Estoy usando Picasso y tengo este problema.
Usaré y veré si UIL da solución.

necesita anular BaseImageDecoder.class y anular el método canDefineExifParams, agregar image / png mimetype, entonces todo está bien

¿Esto está resuelto?

lo siento, no...

------------------ El mensaje original ------------------
De: "Jorge Garrido" , [email protected];
Hora de entrega: 1 de abril de 2016 (viernes) 15:22
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];

Asunto: Re: [nostra13 / Android-Universal-Image-Loader] Error de orientación EXIF ​​(n. ° 559)

¿Esto está resuelto?

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente o véalo en GitHub

Tengo la razón, eso se debe a mimeType en el método canDefineExifParams (String imageUri, String mimeType) de la clase BaseImageDecoder, debe agregar "image / png" en este método.
Lo hice así y funciona.

在 2016-04-01 15:25:18 , "dylan" [email protected]写道 :
lo siento, no...

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

主题: Re: [nostra13 / Android-Universal-Image-Loader] Error de orientación EXIF ​​(# 559)

¿Esto está resuelto?

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente o véalo en GitHub

-
Estás recibiendo esto porque hiciste un comentario.
Responda a este correo electrónico directamente o véalo en GitHub

¿Algún código de muestra @ rx123rx ?

gracias, lo intento mas tarde ...

------------------ El mensaje original ------------------
De: "Monkey.D.Ren" ; [email protected];
Hora de entrega: 1 de abril de 2016 (viernes) 15:42
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];
Cc: "kevin" [email protected];
Asunto: Re: [nostra13 / Android-Universal-Image-Loader] Error de orientación EXIF ​​(n. ° 559)

Tengo la razón, eso se debe a mimeType en el método canDefineExifParams (String imageUri, String mimeType) de la clase BaseImageDecoder, debe agregar "image / png" en este método.
Lo hice así y funciona.

En 2016-04-01 15:25:18, "dylan" [email protected] escribió:
lo siento, no...

------------------ El mensaje original ------------------
De: "Jorge Garrido" , [email protected];
Hora de entrega: 1 de abril de 2016 (viernes) 15:22
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];

Asunto: Re: [nostra13 / Android-Universal-Image-Loader] Error de orientación EXIF ​​(n. ° 559)

¿Esto está resuelto?

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente o véalo en GitHub

-
Estás recibiendo esto porque hiciste un comentario.
Responda a este correo electrónico directamente o véalo en GitHub
-
Estás recibiendo esto porque hiciste un comentario.
Responda a este correo electrónico directamente o véalo en GitHub

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

debido a que el sufijo de las imágenes en la caché es .png, simplemente anulo este método de esta manera.

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

¿Algún código de muestra @ rx123rx ?

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub

ja ja, gracias, ¿puedo tomar su información de contacto?

------------------ 原始 邮件 ------------------
发件人: "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] Error de orientación EXIF ​​(# 559)

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

debido a que el sufijo de las imágenes en la caché es .png, simplemente anulo este método de esta manera.

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

¿Algún código de muestra @ rx123rx ?

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub
-
Estás recibiendo esto porque hiciste un comentario.
Responda a este correo electrónico directamente o véalo en GitHub

¿Funciona?

En 2016-04-01 15:45:42, "dylan" [email protected] escribió:
gracias, lo intento mas tarde ...

------------------ El mensaje original ------------------
De: "Monkey.D.Ren" ; [email protected];
Hora de entrega: 1 de abril de 2016 (viernes) 15:42
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];
Cc: "kevin" [email protected];
Asunto: Re: [nostra13 / Android-Universal-Image-Loader] Error de orientación EXIF ​​(n. ° 559)

Tengo la razón, eso se debe a mimeType en el método canDefineExifParams (String imageUri, String mimeType) de la clase BaseImageDecoder, debe agregar "image / png" en este método.
Lo hice así y funciona.

En 2016-04-01 15:25:18, "dylan" [email protected] escribió:
lo siento, no...

------------------ El mensaje original ------------------
De: "Jorge Garrido" , [email protected];
Hora de entrega: 1 de abril de 2016 (viernes) 15:22
Para: "nostra13 / Android-Universal-Image-Loader" [email protected];

Asunto: Re: [nostra13 / Android-Universal-Image-Loader] Error de orientación EXIF ​​(n. ° 559)

¿Esto está resuelto?

-
Estás recibiendo esto porque estás suscrito a este hilo.
Responda a este correo electrónico directamente o véalo en GitHub

-
Estás recibiendo esto porque hiciste un comentario.
Responda a este correo electrónico directamente o véalo en GitHub
-
Estás recibiendo esto porque hiciste un comentario.
Responda a este correo electrónico directamente o véalo en GitHub

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub

@ rx123rx Parece funcionar en dispositivos Samsung ... pero Sony falla

Creo que puedes ver el logcat, echar un vistazo a qué tipo de sufijo de las imágenes en la caché y luego agregar este tipo de mimeType en ese método.
Tal vez funcione. ¡Buena suerte!

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

@ rx123rx Parece funcionar en dispositivos Samsung ... pero Sony falla

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub

Y funciona en mi HTC M8.

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

@ rx123rx Parece funcionar en dispositivos Samsung ... pero Sony falla

-
Recibes esto porque te mencionaron.
Responda a este correo electrónico directamente o véalo en GitHub

@ nostra13 : He probado esta sección de lógica y funciona en mi caso.

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

Acabo de enfrentar el mismo problema en los dispositivos Samsung, pero considero que ExifParams (verdadero) lo acaba de resolver.

Hola ,

Estoy usando esta biblioteca de cargador de imágenes universal para almacenar imágenes en caché.
Pero cuando recibí la imagen, agregué el cifrado en el archivo y el descifrado mientras se llama a la decodificación.
Estoy enfrentando un problema de dispositivos Samsung, ya que mi imagen se gira.
exif param no se aplica en este momento. por favor ayude si alguien ha solucionado este problema.

mi codigo es:
Para el cifrado es
`@Anular
public boolean save (String imageUri, InputStream imageDataStream, IoUtils.CopyListener listener) lanza 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 : 

La decodificación pública de mapas de bits (ImageDecodingInfo decodingInfo) arroja IOException {
Bitmap decodedBitmap;
ImageFileInfo imageInfo;
InputStream decryptedStream = null;
InputStream imageStream = getImageStream (decodingInfo);
if (imageStream == null) {
Le ("Error sin flujo de imagen", decodingInfo.getImageKey ());
devolver nulo;
}
intentar {
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;
}

''

Usé esto; -
Opciones de DisplayImageOptions = new DisplayImageOptions.Builder ()
.cacheInMemory (verdadero)
.cacheOnDisk (verdadero)
.displayer (nuevo SimpleBitmapDisplayer ())
.resetViewBeforeLoading (verdadero)
.considerExifParams (verdadero)
.construir();

considerExifParams (verdadero) funcionó para mí.

¿Fue útil esta página
0 / 5 - 0 calificaciones