के बिना बड़ी छवियों को लोड करना मेरे पास 5000 x 4000 पीएक्स छवि है जिसे मैं कैनवास पर आकर्षित करना चाहता हूं।आउटऑफमेमरीरर
सबसे पहले मैंने इसे संसाधनों से लोड करने का प्रयास किया। मैंने इसे /res/drawable
में रखा है।
InputStream input = getResources().openRawResource(R.drawable.huge_image);
Drawable d = Drawable.createFromStream(input, "image");
d.setBounds(...);
d.draw(canvas);
यह एक आकर्षण की तरह काम किया:
मैं निम्न विधि का इस्तेमाल किया।
इस मामले में InputStream
एक AssetManager.AssetInputStream
है।
तो अब मैं इसे एसडीकार्ड से लोड करना चाहता हूं।
यहाँ मैं करने की कोशिश की है:
File f = new File(path);
Uri uri = Uri.fromFile(f);
InputStream input = mContext.getContentResolver().openInputStream(uri);
Drawable d = Drawable.createFromStream(input, "image");
इस मामले InputStream
में एक FileInputStream
है और जब Drawable
बनाने मैं एक OutOfMemoryError
मिला है।
तो मैं सोच रहा हूँ:
वहाँ उस त्रुटि हो रही बिना छवि को लोड करने के लिए एक रास्ता है? या FileInputStream
को AssetInputStream
में परिवर्तित करने का कोई तरीका है?
नोट:
मैं छवि का आकार बदलने क्योंकि मैं ज़ूम/कार्यक्षमता पैन को लागू कर रहा हूँ नहीं करना चाहती। कृपया मुझे Loading Large Bitmaps Efficiently पढ़ने के लिए मत कहें।
आप पूर्ण श्रेणी here देख सकते हैं। setImageUri()
का उपयोग करते समय त्रुटि होती है।
यहाँ मेरी त्रुटि लॉग है:
08-13 11:57:54.180: E/AndroidRuntime(23763): FATAL EXCEPTION: main
08-13 11:57:54.180: E/AndroidRuntime(23763): java.lang.OutOfMemoryError: bitmap size exceeds VM budget
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:468)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:332)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:697)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.graphics.drawable.Drawable.createFromStream(Drawable.java:657)
08-13 11:57:54.180: E/AndroidRuntime(23763): at com.benitobertoli.largeimagezoom.ZoomImageView.setDrawablefromUri(ZoomImageView.java:187)
08-13 11:57:54.180: E/AndroidRuntime(23763): at com.benitobertoli.largeimagezoom.ZoomImageView.setImageUri(ZoomImageView.java:588)
08-13 11:57:54.180: E/AndroidRuntime(23763): at com.benitobertoli.largeimagezoom.TestActivity.onKeyDown(TestActivity.java:30)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.view.KeyEvent.dispatch(KeyEvent.java:1257)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.app.Activity.dispatchKeyEvent(Activity.java:2075)
08-13 11:57:54.180: E/AndroidRuntime(23763): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1673)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2493)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2463)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.view.ViewRoot.handleMessage(ViewRoot.java:1752)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.os.Handler.dispatchMessage(Handler.java:99)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.os.Looper.loop(Looper.java:144)
08-13 11:57:54.180: E/AndroidRuntime(23763): at android.app.ActivityThread.main(ActivityThread.java:4937)
08-13 11:57:54.180: E/AndroidRuntime(23763): at java.lang.reflect.Method.invokeNative(Native Method)
08-13 11:57:54.180: E/AndroidRuntime(23763): at java.lang.reflect.Method.invoke(Method.java:521)
08-13 11:57:54.180: E/AndroidRuntime(23763): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-13 11:57:54.180: E/AndroidRuntime(23763): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-13 11:57:54.180: E/AndroidRuntime(23763): at dalvik.system.NativeStart.main(Native Method)
संपादित करें:
मैं एक एचटीसी डिजायर A8181 पर अपने कोड का परीक्षण किया गया था। बताया जाने के बाद कि पहला कोड स्निपेट कुछ अन्य उपकरणों पर काम नहीं कर रहा था, मैंने सैमसंग गैलेक्सी एस 2 और एम्यूलेटर पर परीक्षण किया।
परिणाम: जब संसाधनों से लोड हो रहा है, एमुलेटर एक OutOfMemoryError
, Galaxy S2 एक अपवाद फेंक नहीं था लेकिन उसके परिणाम Drawable
बातिल था दे दी है।
तो मुझे लगता है कि समय का एकमात्र समाधान छवि को कम करना है।
मैंने एम एम्यूलेटर पर अपना कोड चलाने की कोशिश की और मुझे "Res से" विधि पर आउटऑफमेमरी त्रुटि मिल रही है :) आप किस डिवाइस और/या एमुलेटर सेटिंग्स का उपयोग करते हैं जो बिना त्रुटि के इसे चलाने में सक्षम था? – Joe