更新:这个问题似乎归结为一些图像被正确解码,而有些则没有。如果我将非工作JPEG
s 转换为 png
s,它们就可以工作。我从Nikon D5000
、Panasonic Lumix
或Sony Experia
手机直接拍摄JPEG
的图像都无法解码。
我正在使用Picasso
来填充Android
应用程序中的ListView
。但是,我遇到了我要使用的图像的错误--- decoder->decode returned false
,但它适用于我在网络上遇到的其他图片。因此,我相信这与图像有关,但我不太确定。错误出现在Picasso
使用的Skia
库中(据我所知)。
工作正常,而此图像则不然,我需要处理的是后者。我需要使用的所有其他照片都是用同一台相机拍摄的,并由Gimp
以相同的方式进行编辑,从而产生与第一张相同的图像,但它们都不起作用。因此,我怀疑这与图像本身有关,而不是解码器。
弹出的几个问题:
- 元数据是否有可能在此过程中执行某些操作?所有图片中的元数据相似。
- 会不会是编码图像的某些东西使编码器发疯了?如果是这样,它可能是什么,我该如何调查它?文件结束丢失或其他任何东西?
- 是否可以从
Picasso
或Skia
启用更多调试和输出?例如堆栈跟踪? - 非 UTF8 字符会搞砸事情,还是处理正确?示例图像中没有 UTF8 字符,但某些图像可能包含。
我尝试过的:
- 我尝试在
Inkscape
中打开一个不起作用的图像并将其导出为png
文件。现在,图像实际上有效,因此JPEG
编码似乎有一些东西。 - 另一种尝试是在
Gimp
中打开图像并再次导出到JPEG
,但这没有帮助。 - 我还尝试在
Shotwell
中打开图像并重新导出到JPEG
,无论有没有元数据,但这些图像都不起作用。导出到png
的工作方式与从Inkscape
导出到png
相同。 - 所有无法正常工作的图像都是用
Nikon D5000
相机拍摄的,所以我尝试用Sony Experia
手机和Panasonic Lumix
相机拍摄一些图像。没有一个JPEG
直接工作,但如果转换为PNG
它们都会被解码。 - 我尝试设置一个
Picasso.Builder
对象,如下所示,以获取堆栈跟踪。我已经粘贴了下面的堆栈跟踪。看起来实际上是失败的Android.BitmapFactory.decodeStream()
,因为堆栈跟踪指向com.squareup.picasso.BitmapHunter.decodeStream()
,它利用Android.BitmapFactory.decodeStream()
。所以也许错误毕竟与Skia
无关。 - 我还在工作和非工作图像上使用
Imagemagick
的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
堆栈跟踪从 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
的方法:
@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;
}
该错误的原因是:您正在尝试设置大于图像视图布局大小的图像。
我为此找到了一个简单的解决方案!如果您使用毕加索图书馆进行图像加载..然后,调整图像大小以 FIR 图像视图布局。
即,我这样做了:
Picasso.with(ImageLoaderActivity.this)
.load("https://static.pexels.com/photos/34578/pexels-photo.jpg")
.resize(200,250)
.into(img);