2013-09-21 3 views
3

Я декодирую jpeg за два шага.Сброс BufferedInputStream, удерживающий FileInputStream

  1. Проверьте границы, при необходимости определите масштаб.
  2. Декодирование в пределах экрана.

public static Bitmap decodeSampledBitmapFromInputStream(InputStream data, int reqWidth, int reqHeight) 
{ 
    // First decode with inJustDecodeBounds=true to check dimensions 
    final BitmapFactory.Options options = new BitmapFactory.Options(); 
    options.inJustDecodeBounds = true; 
    BitmapFactory.decodeStream(data, null, options); 

    // Calculate inSampleSize 
    options.inSampleSize = Util.getExactSampleSize(options, reqWidth, reqHeight); 

    // Decode bitmap with inSampleSize set 
    options.inJustDecodeBounds = false; 

    try { 
     // TODO: This works, but is there a better way? 
     if (data instanceof FileInputStream) 
      ((FileInputStream)data).getChannel().position(0); 
     else 
      data.reset(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 

    return BitmapFactory.decodeStream(data, null, options); 
} 

Когда основной поток представляет собой FileInputStream он падает на reset() с:

java.io.IOException: Марк был признан недействительным.

Поэтому я добавил раздел instanceof вручную сбросить положение FileInputStream с, но это кажется довольно неудобным решением. Нет ли способа правильно сбросить BufferedInputStream, инкапсулируя FileInputStream?

ответ

3

Перед использованием InputStream.reset сначала необходимо вызвать InputStream.mark, чтобы отметить позицию, которую вы хотите вернуть позже.

+0

Простое решение - оберните данные InputStream с помощью BufferedInputStream всегда, это не повредит, даже если это уже BufferedInputStream –

+0

Я пробовал это, обертывая при необходимости. Независимо от того, что я пробовал, включая ваше предложение выше, если базовый поток является «FileInputStream», он сбой. – Anthony

+1

BufferedInputStream буферизует ваш файл в память с отметки. Если файл слишком большой, он может упасть. – Sasa

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