Я декодирую jpeg за два шага.Сброс BufferedInputStream, удерживающий FileInputStream
- Проверьте границы, при необходимости определите масштаб.
- Декодирование в пределах экрана.
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
?
Простое решение - оберните данные InputStream с помощью BufferedInputStream всегда, это не повредит, даже если это уже BufferedInputStream –
Я пробовал это, обертывая при необходимости. Независимо от того, что я пробовал, включая ваше предложение выше, если базовый поток является «FileInputStream», он сбой. – Anthony
BufferedInputStream буферизует ваш файл в память с отметки. Если файл слишком большой, он может упасть. – Sasa