تحميل مورد على صورة نقطية قابلة للتغيير
-
02-10-2019 - |
سؤال
أقوم بتحميل صورة نقطية من مورد مثل ذلك:
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 ، تحقق من هذا المنشور:
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);