2015-06-20 2 views
4

Обновление: Похоже, что этот вопрос сводится к тому, что некоторые изображения правильно декодируются, а некоторые нет. Если я конвертирую неработающие 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 таким же образом, что приводит к изображениям, подобным первому, но ни один из них не работает. Следовательно, я подозреваю, что это как-то связано с самими изображениями, а не с декодером.

Несколько вопросов, которые выскакивают:

  1. Возможно ли, что метаданные могут сделать что-то в этом процессе? Метаданные одинаковы во всех изображениях.
  2. Это может быть что-то с закодированными изображениями, которые заставляют кодировщика сходить с ума? Если да, то что это может быть и как я могу его исследовать? Конец файла отсутствует или что-то еще?
  3. Возможно ли включить дополнительную отладку и вывод из Picasso или Skia? Например, следы стека?
  4. Будут ли символы, не относящиеся к UTF8, испортить вещи, или это правильно? В образце примера нет символов UTF8, но некоторые изображения могут иметь.

То, что я пробовал:

  1. Я попытался открыть нерабочее изображение в Inkscape и экспортировать его в файл png вместо этого. Теперь изображение действительно работает, поэтому, похоже, что-то есть с кодировкой JPEG.
  2. Другая попытка состояла в том, чтобы открыть изображение в Gimp и снова экспортировать в JPEG, но это не помогло.
  3. Я также попытался открыть изображение в Shotwell и реэкспортировать до JPEG, как с метаданными, так и без них, но ни одно из этих изображений не работает. Экспорт в png работает так же, как и экспорт в png от Inkscape.
  4. Все неработающие изображения взяты с помощью камеры Nikon D5000, поэтому я попытался сделать несколько снимков с помощью телефона Sony Experia и камеры Panasonic Lumix. Non of JPEG s работает напрямую, но если преобразован в PNG, все они декодируются.
  5. Я попытался настроить объект Picasso.Builder, как показано на рисунке here, чтобы получить трассировку стека.Я вставил трассировку стека ниже. Может показаться, что на самом деле это Android.BitmapFactory.decodeStream(), который терпит неудачу, поскольку трассировка стека указывает на com.squareup.picasso.BitmapHunter.decodeStream(), в котором используется Android.BitmapFactory.decodeStream(). Так что, возможно, ошибка не имеет ничего общего с Skia в конце концов.
  6. Я также использовал Imagemagickidentify -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; 
} 

ответ

0

Причина этой ошибки: Вы пытаетесь установить изображение размером, который больше, чем ваше изображение размером вид макета ,

Я нашел простое решение для этого! Если вы используете библиотеку picasso для загрузки изображений, то измените размер изображения на пиктограмму вашего изображения.

т.е., я сделал так:

Picasso.with(ImageLoaderActivity.this) 
         .load("https://static.pexels.com/photos/34578/pexels-photo.jpg") 
         .resize(200,250) 
         .into(img); 
Смежные вопросы