Обновление: Похоже, что этот вопрос сводится к тому, что некоторые изображения правильно декодируются, а некоторые нет. Если я конвертирую неработающие JPEG
s в png
s, они работают. Ни одно из моих изображений, взятое непосредственно как JPEG
s из Nikon D5000
, a Panasonic Lumix
или Sony Experia
телефон может быть расшифрован.Picasso не может декодировать некоторые изображения: skia decode возвращается false
Я использую Picasso
заполнить ListView
в моем Android
приложение. Я, однако, столкнулся с ошибкой --- decoder->decode returned false
для изображений, которые я должен использовать, но он отлично работает для других фотографий, которые я просматриваю в Интернете. Поэтому я считаю, что это имеет какое-то отношение к изображениям, но я не уверен. Ошибка возникает в библиотеке Skia
, которая используется Picasso
(насколько я знаю).
Например, this изображение работает нормально, а this нет, и это последнее, что мне нужно для работы. Все остальные снимки, которые мне нужно использовать, берутся с той же камерой и редактируются Gimp
таким же образом, что приводит к изображениям, подобным первому, но ни один из них не работает. Следовательно, я подозреваю, что это как-то связано с самими изображениями, а не с декодером.
Несколько вопросов, которые выскакивают:
- Возможно ли, что метаданные могут сделать что-то в этом процессе? Метаданные одинаковы во всех изображениях.
- Это может быть что-то с закодированными изображениями, которые заставляют кодировщика сходить с ума? Если да, то что это может быть и как я могу его исследовать? Конец файла отсутствует или что-то еще?
- Возможно ли включить дополнительную отладку и вывод из
Picasso
илиSkia
? Например, следы стека? - Будут ли символы, не относящиеся к UTF8, испортить вещи, или это правильно? В образце примера нет символов UTF8, но некоторые изображения могут иметь.
То, что я пробовал:
- Я попытался открыть нерабочее изображение в
Inkscape
и экспортировать его в файлpng
вместо этого. Теперь изображение действительно работает, поэтому, похоже, что-то есть с кодировкойJPEG
. - Другая попытка состояла в том, чтобы открыть изображение в
Gimp
и снова экспортировать вJPEG
, но это не помогло. - Я также попытался открыть изображение в
Shotwell
и реэкспортировать доJPEG
, как с метаданными, так и без них, но ни одно из этих изображений не работает. Экспорт вpng
работает так же, как и экспорт вpng
отInkscape
. - Все неработающие изображения взяты с помощью камеры
Nikon D5000
, поэтому я попытался сделать несколько снимков с помощью телефонаSony Experia
и камерыPanasonic Lumix
. Non ofJPEG
s работает напрямую, но если преобразован вPNG
, все они декодируются. - Я попытался настроить объект
Picasso.Builder
, как показано на рисунке here, чтобы получить трассировку стека.Я вставил трассировку стека ниже. Может показаться, что на самом деле этоAndroid.BitmapFactory.decodeStream()
, который терпит неудачу, поскольку трассировка стека указывает наcom.squareup.picasso.BitmapHunter.decodeStream()
, в котором используетсяAndroid.BitmapFactory.decodeStream()
. Так что, возможно, ошибка не имеет ничего общего сSkia
в конце концов. - Я также использовал
Imagemagick
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
, указывая на this файл.
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;
}