2015-05-10 3 views
1

Я пытаюсь декодировать InputStream для растрового изображения, код настолько прост:андроид BitmapFactory.decodeStream низкое качество

Bitmap myBitmap = BitmapFactory.decodeStream(myStream); 

НО качество outputed растрового изображения является слишком низким (иногда, а иногда качество хорошее).

также источник изображения хорошего качества.

я пытался играть с опциями Bitmap, но ничего не изменилось:

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled = false; 
options.inDither = false; 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
Bitmap myBitmap = BitmapFactory.decodeStream(myStream, null, options); 

так, как я могу получить полное качество растрового изображения?

Update 1:

Я использую эту картинку для анимации, как показано ниже:

coverAnimationImage.post(new Runnable() 
{ 
    Override 
    public void run() 
    { 
     try 
     { 
      InputStream coverStream = getCoverStream(); 
      if(coverStream != null) 
      { 
       bookCover = BitmapFactory.decodeStream(coverStream); 
      } 
     } 
     catch (Exception e) 
     { 
      // no cover 
     } 
     coverAnimationImage.setImageBitmap(bookCover); 
     mBackground = new ColorDrawable(Color.BLACK); 
     if(Build.VERSION.SDK_INT >= 16) 
     { 
      coverAnimationLayout.setBackground(mBackground); 
     } 
     else 
     { 
      coverAnimationLayout.setBackgroundDrawable(mBackground); 
     } 
     if (flag) 
     { 
      ViewTreeObserver observer = coverAnimationImage.getViewTreeObserver(); 
      observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() 
      { 
       @Override 
       public boolean onPreDraw() 
       { 
        coverAnimationImage.getViewTreeObserver().removeOnPreDrawListener(this); 
        int[] screenLocation = new int[2]; 
        coverAnimationImage.getLocationOnScreen(screenLocation); 
        mLeftDelta = coverLeft - (screenLocation[0]); 
        mTopDelta = coverTop - (screenLocation[1]); 
        mWidthScale = (float) coverWidth/coverAnimationImage.getWidth(); 
        mHeightScale = (float) coverHeight/coverAnimationImage.getHeight(); 
        runEnterAnimation(); 
        return true; 
       } 
      }); 
     } 
    } 
}); 

Я думаю, когда я бегу анимации BitmapFactory.decodeStream не закончил его работу! Является ли это возможным? или любая идея, что здесь происходит?

Обновление 2: информационное изображение

enter image description here

Обновление 3:

низкое качество изображения:

enter image description here

высокого качества:

enter image description here

монитор памяти:

enter image description here

YouTube Видео:

android BitmapFactory.decodeStream low quality

Update 4:

код getCoverStream:

protected InputStream getCoverStream() 
{  
    String fileName = getCoverAddress(); 
    InputStream in = null; 
    ZipEntry containerEntry = mZip.getEntry(fileName); 
    if (containerEntry != null) 
    { 
     try 
     { 
      in = mZip.getInputStream(containerEntry); 
     } 
     catch (IOException e) 
     { 
      Log.e(TAG, "Error reading zip file " + fileName, e); 
     } 
    } 

    if (in == null) 
    { 
     Log.e(TAG, "Unable to find file in zip: " + fileName); 
    } 

    return in; 
} 
+0

Стандартный подход должен работать ... DecodeStream будет декодировать полнофункциональную графику по умолчанию , Мне интересно, правильно ли настроены ваши папки ресурсов. Например, если вы разместите высококачественную графику в папке «ldpi» и низкокачественную графику в папке «xxhdpi», среда может подумать, что она выбирает высококачественную графику, но заканчивает вывод изображения низкого качества. Возможно, мы могли бы лучше помочь, если бы вы сказали нам, что разрешения изображений используются в каждой из папок активов? (ldpi/mdpi/hdpi/xhdpi/xxhdpi) – 1owk3y

+0

@ 1owk3y Изображение, которое я использовал для декодирования, не находится в доступных папках. изображение, извлеченное как поток из книги эпоса. я вижу, что изображение имеет хорошую qality. – mehdok

+0

Является ли образ прогрессивным? Возможно, он останавливается только после того, как получит первый прогон пробы (низкое качество). Попробуйте не прогрессивное изображение? (просто исключая возможность, прежде чем мы копаем дальше). Если использование непрогрессивного изображения устраняет проблему, то вы узнаете, что она останавливается после первого прохода (и может найти, как сообщить Android, как не останавливаться после первого прохода. Извините, я посмотрел бы это прямо сейчас но я в пути) – 1owk3y

ответ

2

Это не может быть на самом деле проблема с BitmapFactory.decodeStream(), поскольку decodeStream декодирует данные с полным разрешением по умолчанию.

Мы видим, что вы используете ZipEntry. Это может быть проблема потока, который не полностью загружается, или поток (getCoverStream), который не вызывается.

Попробуйте mZip.getSize(); mZip.getCompressedSize(); mZip.getCrc(); в LogCat. Отличаются ли результаты от попыток загрузки с разными качествами?Я пытаюсь определить, останавливается ли zip-загрузка через определенное количество времени, отбрасывается, а затем просто отображается информация, которую он имеет и т.д.

Смежные вопросы