سؤال

أقوم بتحميل صورة نقطية من مورد مثل ذلك:

 Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);

ما أريد القيام به هو إجراء بعض التغييرات على صورة نقطية قبل رسمها إلى اللوحة الرئيسية في بلدي سحب الطريقة (كما يبدو الأمر مضيئًا لتكرار الكثير من الرسم في حلقتاتي الرئيسية عندما لن يتغير). أقوم بإجراء التغييرات على صورة نقطية مع ما يلي:

Canvas c = new Canvas(mBackground);
c.drawARGB(...); // etc

لذلك من الطبيعي أن أحصل على استثناء

java.lang.IllegalStateException: Immutable bitmap passed to Canvas constructor

لتجنب أنني قمت بإنشاء نسخة من صورة نقطية بحيث تكون قابلة للتغيير

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image).copy(Bitmap.Config.ARGB_8888, true);

ما الذي يتجنب المشكلة ، ولكنها تسبب في بعض الأحيان OutofMemoryExceptions ، هل تعرف أي طرق أفضل لتحقيق ما أريد؟

هل كانت مفيدة؟

المحلول

هناك عدة طرق لإنشاء نسخة منه. قد يساعدك هذا الموضوع: http://www.anddev.org/how_to_modify_the_image_file-t513.html

نصائح أخرى

يستخدم decodeResource(Resources res, int id, BitmapFactory.Options opts) وحدد inMutable في الخيارات.

http://developer.android.com/reference/android/graphics/bitmapfactory.html

من الأفضل استخدامه RapidDecoder.

import rapid.decoder.BitmapDecoder;

Bitmap mBackground = BitmapDecoder.from(res, R.drawable.image)
        .mutable().decode();

يعمل لصالح API المستوى 8.

في حال كنت بحاجة إلى التعامل مع جميع مستويات API ، تحقق من هذا المنشور:

https://stackoverflow.com/a/16314940/878126

instad لك:

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image);

يستخدم:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inMutable = true;

Bitmap mBackground = BitmapFactory.decodeResource(res,R.drawable.image, options);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top