4

更新:似乎这个问题归结为一些图像被正确解码,而有些则没有。如果我将非工作JPEG的 s 转换为pngs,它们就会工作。JPEG我从 a Nikon D5000、 aPanasonic Lumix或phone中直接以 s 形式拍摄的图像Sony Experia都无法解码。


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

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

弹出几个问题:

  1. 元数据有可能在这个过程中做些什么吗?所有图片中的元数据都是相似的。
  2. 编码图像是否会导致编码器发疯?如果是这样,它可能是什么,我该如何调查它?文件结尾丢失还是什么?
  3. 是否可以从Picassoor启用更多调试和输出Skia?例如,堆栈跟踪?
  4. 非 UTF8 字符会搞砸,还是处理正确?示例图像中没有 UTF8 字符,但某些图像可能有。

我试过的:

  1. 我尝试打开一个非工作图像Inkscape并将其导出为png文件。JPEG现在,图像实际上可以工作,因此编码似乎有些问题。
  2. 另一种尝试是打开图像Gimp并再次导出JPEG,但这没有帮助。
  3. 我还尝试在有和没有元数据的情况下打开图像Shotwell并重新导出到JPEG,但这些图像都不起作用。导出到png与导出到pngfrom一样Inkscape
  4. 所有不工作的图像都是用Nikon D5000相机拍摄的,所以我试着用Sony Experia手机和Panasonic Lumix相机拍了几张照片。非JPEGs 直接工作,但如果转换为PNG它们都将被解码。
  5. 我尝试设置一个Picasso.Builder对象,如此处所示以获取堆栈跟踪。我在下面粘贴了堆栈跟踪。看起来它实际上是Android.BitmapFactory.decodeStream()失败的,因为堆栈跟踪指向com.squareup.picasso.BitmapHunter.decodeStream(),它利用Android.BitmapFactory.decodeStream(). Skia所以也许这个错误毕竟与此无关。
  6. 我还在工作和非工作图像上使用了Imagemagick's并比较了输出。identify -verbose我找不到任何突出的差异,所以它没有让我更进一步。

示例 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 

来自 的堆栈跟踪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)

getViewBaseAdapter的方法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;
}
4

1 回答 1

0

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

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

即,我这样做了:

Picasso.with(ImageLoaderActivity.this)
                        .load("https://static.pexels.com/photos/34578/pexels-photo.jpg")
                        .resize(200,250)
                        .into(img);
于 2017-04-01T10:06:11.057 回答