Picasso no puede decodificar algunas imágenes: skia decode devuelto false

Actualización: Parece que esta pregunta se reduce a que algunas imágenes se decodifican correctamente, mientras que otras no. Si convierto el JPEG no funciona a png s, funcionan. Ninguna de mis imágenes tomadas directamente como JPEG desde un Nikon D5000 , un Panasonic Lumix o un Sony Experia teléfono puede ser decodificado.


Estoy utilizando Picasso para rellenar un ListView en mi aplicación para Android . Estoy, sin embargo, corriendo en el error --- decoder->decode returned false para las imágenes que voy a utilizar, pero funciona bien para otras imágenes que se ejecutan a través de la web. Por lo tanto, creo que tiene algo que ver con las imágenes, pero no estoy realmente seguro. El error surge en la biblioteca de Skia que es utilizada por Picasso (hasta donde yo sé).

Por ejemplo, esta imagen funciona bien, mientras que esto no lo hace, y es la última que tengo que trabajar. Todas las otras imágenes que necesito usar son tomadas con la misma cámara y editadas por Gimp de la misma manera, resultando en imágenes como la primera, pero ninguna de ellas funciona. Por lo tanto, sospecho que tiene algo que ver con las imágenes en lugar de con el decodificador.

Algunas preguntas que aparecen:

  1. ¿Es posible que los metadatos puedan hacer algo en este proceso? Los metadatos son similares en todas las imágenes.
  2. ¿Podría ser algo con las imágenes codificadas que hace que el codificador se vuelva loco? Si es así, ¿qué podría ser y cómo puedo investigarlo? ¿Falta el final del archivo o algo?
  3. ¿Es posible habilitar más depuración y salida de Picasso o Skia ? ¿Trazas de la pila, por ejemplo?
  4. ¿Los personajes no-UTF8 ensuciarán las cosas, o se manejará correctamente? La imagen de ejemplo no tiene caracteres UTF8 en ella, pero algunas de las imágenes pueden tener.

Lo que he intentado:

  1. Intenté abrir una imagen que no funciona en Inkscape y exportarla como un archivo png lugar. Ahora, la imagen realmente funciona, por lo que parece haber algo con la codificación JPEG .
  2. Otro intento fue abrir la imagen en Gimp y exportar a JPEG nuevo, pero eso no ayudó.
  3. También intenté abrir la imagen en Shotwell y volver a exportar a JPEG , con y sin los metadatos, pero ninguna de estas imágenes funcionan. Exportación a png funciona como con la exportación a png de Inkscape .
  4. Todas las imágenes que no funcionan se toman con una cámara Nikon D5000 , así que intenté tomar algunas imágenes con un teléfono Sony Experia y una cámara Panasonic Lumix . Los JPEG funcionan directamente, pero si se convierten a PNG , todos ellos se decodifican.
  5. He intentado configurar un objeto Picasso.Builder como se muestra aquí , para obtener un seguimiento de la pila. He pegado el rastro de la pila abajo. Puede parecer que en realidad es Android.BitmapFactory.decodeStream() que falla, ya que el rastreo de la pila señala com.squareup.picasso.BitmapHunter.decodeStream() , que utiliza Android.BitmapFactory.decodeStream() . Así que tal vez el error no tiene nada que ver con Skia después de todo.
  6. También utilicé la imagen de Imagemagick en las imágenes de trabajo y las que no funcionaban y comparaba las salidas. No pude encontrar ninguna diferencia que se destacó, por lo que no me trajo más.

Ejemplo de salida Logcat:

 D/Picasso(528): Main created [R0] Request{http://www.miasmat.no/wp-content/uploads/2015/05/OvnsbaktKveite9.jpg} D/Picasso(528): Dispatcher enqueued [R0]+7ms D/Picasso(528): Main created [R1] Request{http://www.miasmat.no/wp-content/uploads/2015/05/OvnsbaktKveite9.jpg} D/Picasso(528): Hunter joined [R1]+1ms to [R0]+10ms, [R1]+1ms D/Picasso(528): Main created [R2] Request{http://www.miasmat.no/wp-content/uploads/2015/05/OvnsbaktKveite9.jpg} D/Picasso(528): Hunter joined [R2]+1ms to [R0]+14ms, [R1]+5ms, [R2]+2ms D/Picasso(528): Hunter executing [R0]+21ms, [R1]+12ms, [R2]+9ms D/skia(528): --- decoder->decode returned false D/Picasso(528): Dispatcher retrying [R0]+1456ms, [R1]+1447ms, [R2]+1444ms D/Picasso(528): Hunter executing [R0]+1458ms, [R1]+1448ms, [R2]+1445ms D/skia(528): --- decoder->decode returned false D/Picasso(528): Dispatcher retrying [R0]+2867ms, [R1]+2857ms, [R2]+2854ms D/Picasso(528): Hunter executing [R0]+2868ms, [R1]+2859ms, [R2]+2855ms D/skia(528): --- decoder->decode returned false D/Picasso(528): Dispatcher batched [R0]+3406ms, [R1]+3397ms, [R2]+3394ms for error D/dalvikvm(249): GC_EXPLICIT freed 119 objects / 5288 bytes in 28ms I/TAGZ(528): Error! url = http://www.miasmat.no/wp-content/uploads/2015/05/OvnsbaktKveite9.jpg D/Picasso(528): Main errored [R0]+3607ms I/TAGZ(528): Error! url = http://www.miasmat.no/wp-content/uploads/2015/05/OvnsbaktKveite9.jpg D/Picasso(528): Main errored [R1]+3598ms I/TAGZ(528): Error! url = http://www.miasmat.no/wp-content/uploads/2015/05/OvnsbaktKveite9.jpg D/Picasso(528): Main errored [R2]+3596ms D/Picasso(528): Dispatcher delivered [R0]+3610ms, [R1]+3601ms, [R2]+3598ms 

Traza la pila de Picasso , apuntando a este archivo.

 W/System.err(1467): java.io.IOException: Failed to decode stream. W/System.err(1467): at com.squareup.picasso.BitmapHunter.decodeStream(BitmapHunter.java:145) W/System.err(1467): at com.squareup.picasso.BitmapHunter.hunt(BitmapHunter.java:217) W/System.err(1467): at com.squareup.picasso.BitmapHunter.run(BitmapHunter.java:159) W/System.err(1467): at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) W/System.err(1467): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) W/System.err(1467): at java.util.concurrent.FutureTask.run(FutureTask.java:137) W/System.err(1467): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) W/System.err(1467): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) W/System.err(1467): at java.lang.Thread.run(Thread.java:1096) W/System.err(1467): at com.squareup.picasso.Utils$PicassoThread.run(Utils.java:411) 

getView en mi BaseAdapter para el ListView :

 @Override public View getView(int position, View convertView, ViewGroup parent) { final View view; Recipe recipe = this.getItem(position); if (convertView != null){ view = convertView; view.setTag(recipe.getId()); } else{ view = myActivity.getLayoutInflater().inflate(R.layout.recipe_item, parent, false); view.setTag(recipe.getId()); } ImageView imageView = (ImageView) view.findViewById(R.id.filtered_recipes_list_image_view); // final String foo = "https://cms-assets.tutsplus.com/uploads/users/21/posts/19431/featured_image/CodeFeature.jpg"; final String foo = "http://www.miasmat.no/wp-content/uploads/2015/05/OvnsbaktKveite9.jpg"; Picasso.with(myActivity).setIndicatorsEnabled(true); Picasso.with(myActivity).setLoggingEnabled(true); Picasso.with(myActivity).load(foo).into(imageView, new Callback() { @Override public void onSuccess() { Log.i("TAGZ", "Success! url = " + foo); } @Override public void onError() { Log.i("TAGZ", "Error! url = " + foo); } }); return view; } 

La razón de este error es: Está intentando establecer una imagen de tamaño que es más que el tamaño de diseño de vista de imagen.

¡Encontré una solución simple para eso! Si está utilizando la biblioteca picasso para la carga de la imagen .. entonces, cambiar el tamaño de la imagen para firmar su diseño de vista de la imagen.

es decir, he hecho así:

 Picasso.with(ImageLoaderActivity.this) .load("https://static.pexels.com/photos/34578/pexels-photo.jpg") .resize(200,250) .into(img); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.