更新:似乎这个问题归结为一些图像被正确解码,而有些则没有。如果我将非工作JPEG
的 s 转换为png
s,它们就会工作。JPEG
我从 a Nikon D5000
、 aPanasonic Lumix
或phone中直接以 s 形式拍摄的图像Sony Experia
都无法解码。
我Picasso
用来填写ListView
我的Android
应用程序。但是,我遇到了我要使用的图像的错误--- decoder->decode returned false
,但它适用于我在网络上遇到的其他图片。因此,我认为这与图像有关,但我不确定。错误出现在(据我所知)Skia
使用的库中。Picasso
例如,这张图片可以正常工作,而这不能,而我需要处理的是后者。我需要使用的所有其他照片都是用同一台相机拍摄的,并Gimp
以相同的方式进行编辑,从而产生与第一张类似的图像,但它们都不起作用。因此,我怀疑它与图像本身而不是解码器有关。
弹出几个问题:
- 元数据有可能在这个过程中做些什么吗?所有图片中的元数据都是相似的。
- 编码图像是否会导致编码器发疯?如果是这样,它可能是什么,我该如何调查它?文件结尾丢失还是什么?
- 是否可以从
Picasso
or启用更多调试和输出Skia
?例如,堆栈跟踪? - 非 UTF8 字符会搞砸,还是处理正确?示例图像中没有 UTF8 字符,但某些图像可能有。
我试过的:
- 我尝试打开一个非工作图像
Inkscape
并将其导出为png
文件。JPEG
现在,图像实际上可以工作,因此编码似乎有些问题。 - 另一种尝试是打开图像
Gimp
并再次导出JPEG
,但这没有帮助。 - 我还尝试在有和没有元数据的情况下打开图像
Shotwell
并重新导出到JPEG
,但这些图像都不起作用。导出到png
与导出到png
from一样Inkscape
。 - 所有不工作的图像都是用
Nikon D5000
相机拍摄的,所以我试着用Sony Experia
手机和Panasonic Lumix
相机拍了几张照片。非JPEG
s 直接工作,但如果转换为PNG
它们都将被解码。 - 我尝试设置一个
Picasso.Builder
对象,如此处所示,以获取堆栈跟踪。我在下面粘贴了堆栈跟踪。看起来它实际上是Android.BitmapFactory.decodeStream()
失败的,因为堆栈跟踪指向com.squareup.picasso.BitmapHunter.decodeStream()
,它利用Android.BitmapFactory.decodeStream()
.Skia
所以也许这个错误毕竟与此无关。 - 我还在工作和非工作图像上使用了
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)
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;
}