2013-06-18 2 views
0

Я пытаюсь загрузить большое растровое изображение.Загрузка больших растровых изображений эффективно android

Я прочитал это: http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

и я пытаюсь создать один и тот же метод из строки

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

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

     // Decode bitmap with inSampleSize set 
     options.inJustDecodeBounds = false; 
     return BitmapFactory.decodeStream(is,null,options); 
} 

Я уверен, что InputStream является правильным, потому что в предыдущей версии я непосредственно нагружал растровые изображения

с помощью decodeSampleBitmapFromStream я всегда иметь нулевой возврат

Спасибо

Редактировать

Я пытаюсь добавить это после InputStream использовать

try { 
    is.mark(1 << 24); 
    // also try is.mark(0); 
    is.reset(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Я имею эту ошибку

06-18 09:55:31.831: W/System.err(16460): java.io.IOException 
06-18 09:55:31.831: W/System.err(16460): at java.io.InputStream.reset(InputStream.java:221) 
06-18 09:55:31.831: W/System.err(16460): at ant.fileExplorer.FileExplorerAdapter.decodeSampleBitmapFromStream(FileExplorerAdapter.java:124) 
06-18 09:55:31.831: W/System.err(16460): at ant.fileExplorer.FileExplorerAdapter.getView(FileExplorerAdapter.java:56) 
06-18 09:55:31.831: W/System.err(16460): at android.widget.AbsListView.obtainView(AbsListView.java:1430) 
06-18 09:55:31.831: W/System.err(16460): at android.widget.ListView.makeAndAddView(ListView.java:1793) 
06-18 09:55:31.831: W/System.err(16460): at android.widget.ListView.fillDown(ListView.java:670) 
06-18 09:55:31.831: W/System.err(16460): at android.widget.ListView.fillFromTop(ListView.java:727) 
06-18 09:55:31.831: W/System.err(16460): at android.widget.ListView.layoutChildren(ListView.java:1646) 
06-18 09:55:31.831: W/System.err(16460): at android.widget.AbsListView.onLayout(AbsListView.java:1260) 
06-18 09:55:31.841: W/System.err(16460): at android.view.View.layout(View.java:7277) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
06-18 09:55:31.841: W/System.err(16460): at android.view.View.layout(View.java:7277) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-18 09:55:31.841: W/System.err(16460): at android.view.View.layout(View.java:7277) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047) 
06-18 09:55:31.841: W/System.err(16460): at android.view.View.layout(View.java:7277) 
06-18 09:55:31.841: W/System.err(16460): at android.widget.FrameLayout.onLayout(FrameLayout.java:338) 
06-18 09:55:31.841: W/System.err(16460): at android.view.View.layout(View.java:7277) 
06-18 09:55:31.841: W/System.err(16460): at android.view.ViewRoot.performTraversals(ViewRoot.java:1203) 
06-18 09:55:31.841: W/System.err(16460): at android.view.ViewRoot.handleMessage(ViewRoot.java:1957) 
06-18 09:55:31.841: W/System.err(16460): at android.os.Handler.dispatchMessage(Handler.java:99) 
06-18 09:55:31.841: W/System.err(16460): at android.os.Looper.loop(Looper.java:150) 
06-18 09:55:31.841: W/System.err(16460): at android.app.ActivityThread.main(ActivityThread.java:4277) 
06-18 09:55:31.841: W/System.err(16460): at java.lang.reflect.Method.invokeNative(Native Method) 
06-18 09:55:31.851: W/System.err(16460): at java.lang.reflect.Method.invoke(Method.java:507) 
06-18 09:55:31.851: W/System.err(16460): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
06-18 09:55:31.851: W/System.err(16460): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
06-18 09:55:31.851: W/System.err(16460): at dalvik.system.NativeStart.main(Native Method) 
+0

Вы используете входной поток в другом месте до этой функции? проблема с входными потоками заключается в том, что вы не можете использовать их снова. –

ответ

1

Попробуйте добавить is.reset() прежде чем вы хотите загрузить растровое изображение «для реального»

// First make sure you are using a BufferedInputStream 
InputStream bis = new BufferedInputStream(is) 

// Decode bitmap with inSampleSize set 
options.inJustDecodeBounds = false; 
bis.reset(); 

Я считаю, что при использовании inJustDecodeBounds = true случаются смешные вещи. Он прочитает часть потока для этой операции. Сброс работает для меня.

Редактировать: вам необходимо обернуть объект inputStream в BufferedInputStream, который поддерживает .reset().

+0

Спасибо, но у меня есть исключение, используя reset (я редактирую свой первый пост) – Ajouve

+0

Оберните его в «BufferedInputStream» и нас это. 'InputStream bis = new BufferedInputStream (is)'. Затем используйте 'bis' везде, где у вас есть' is'. Это сработает! –

+0

Спасибо, что работает – Ajouve

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