毕加索无法解码某些图片:skia decode返回false

时间:2015-06-20 10:32:56

标签: android picasso bitmapfactory skia

更新:似乎这个问题归结为一些图像被正确解码,而有些则没有。如果我将非工作JPEG转换为png,则可以正常工作。我的所有图片都不能直接从JPEGNikon D5000Panasonic Lumix手机中Sony Experia获取。

我正在使用Picasso填充ListView应用中的Android。但是,对于我要使用的图像,我遇到了错误--- decoder->decode returned false,但它适用于我在网络上运行的其他图片。因此,我认为它与图像有关,但我不太确定。 Skia使用的Picasso库中出现错误(据我所知)。

例如,this图片工作正常,而this没有,而后者我需要工作。我需要使用的所有其他图片都是使用相同的相机拍摄的,并由Gimp以相同的方式进行编辑,从而产生类似第一张的图像,但它们都不起作用。因此,我怀疑它与图像本身而不是解码器有关。

出现了一些问题:

  1. 元数据是否可以在此过程中执行某些操作?所有图片中的元数据都相似。
  2. 编码图像是否会使编码器变得疯狂?如果是这样,它会是什么,我该如何调查呢?文件结尾丢失或什么?
  3. 是否可以从PicassoSkia启用更多调试和输出?例如,堆栈跟踪?
  4. 非UTF8字符是否会弄乱,或处理得当?示例图像中没有UTF8字符,但有些图像可能有。
  5. 我尝试了什么:

    1. 我尝试在Inkscape中打开一张非工作图片,然后将其导出为png文件。现在,图像确实有效,所以似乎有JPEG编码。
    2. 另一种尝试是在Gimp中打开图片并再次导出到JPEG,但这没有帮助。
    3. 我还尝试在Shotwell中打开图片并重新导出到JPEG,无论是否有元数据,但这些图片都不起作用。导出到png与从png导出到Inkscape一样。
    4. 所有非工作图像均使用Nikon D5000相机拍摄,因此我尝试使用Sony Experia手机和Panasonic Lumix相机拍摄一些图像。 JPEG不是直接工作,但如果转换为PNG,则全部解码。
    5. 我尝试设置一个Picasso.Builder对象,如图here所示,以获得堆栈跟踪。我已粘贴下面的堆栈跟踪。看起来它实际上是Android.BitmapFactory.decodeStream()失败,因为堆栈跟踪指向com.squareup.picasso.BitmapHunter.decodeStream(),它使用Android.BitmapFactory.decodeStream()。因此,错误可能与Skia无关。
    6. 我还在工作和非工作图像上使用Imagemagick的{​​{1}}并比较了输出。我无法找到任何突出的差异,所以它没有给我带来任何进一步的发展。
    7. 示例Logcat输出:

      identify -verbose

      来自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 的堆栈跟踪,指向this文件。

      Picasso
      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中的

      BaseAdapter方法:

      ListView

1 个答案:

答案 0 :(得分:0)

该错误的原因是:您正在尝试设置大小超过图像视图布局大小的图像。

我找到了一个简单的解决方案!如果您使用毕加索库进行图像加载,那么请调整图像大小以调整图像视图布局。

即我这样做了:

Picasso.with(ImageLoaderActivity.this)
                        .load("https://static.pexels.com/photos/34578/pexels-photo.jpg")
                        .resize(200,250)
                        .into(img);