你好,我正在创建一款图像编辑应用程序,我正在为画布和ImageView创建位图
在这里,我在ImageView中使用了一个2000x2000尺寸、大小为385kb的图像文件
我的问题是,第一次我用其他小图像创建位图并编辑图像时有时会成功,但第二次使用上述大小和尺寸时会生成java.lang.OutOfMemoryError :(
以下是相关方法代码:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initialize variable
init();
// initialize view
initView();
// initialize view's event listener
initEventListener();
setImageToImageView(ims);
}
private void init() {
context = MainActivity.this;
db_colorImage = new DB_ColorImage(context);
AppUtils.setColorPreference(MainActivity.this, AppConstant.PREF_COLOR_PIC, "FF0000");
AppUtils.setComboColorPreference(MainActivity.this, AppConstant.PREF_COMBO, 1);
openCatId = getIntent().getIntExtra("open_cat_id", -1);
openCat = getIntent().getStringExtra("image_categoryname");
openImgName = getIntent().getStringExtra("img_name");
db_colorImage.openDB();
db_colorImage.startTransaction();
assetsImgxx = db_colorImage.getXXX(openCatId);
db_colorImage.successfullTransaction();
db_colorImage.completeTransaction();
db_colorImage.closeDB();
assetsAndSdImage = new ArrayList<>(getIntent().getStringArrayListExtra("again")); // aa list edit karelu with sdcard image
try {
ims = getAssets().open(openCat + "/" + openImgName);
} catch (IOException e) {
File getFromSd = new File(AppUtils.appFolder() + File.separator + openImgName);
try {
ims = new FileInputStream(getFromSd);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
public void setImageToImageView(InputStream ims) {
Drawable d = Drawable.createFromStream(ims, null);
BitmapDrawable drawable = (BitmapDrawable) d;
Bitmap bmp = drawable.getBitmap();
if (bmp != null) {
_alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888); // here i used ARGB_8888 because jnibitmap.cpp also use ARGB_8888. If we do not use this it wont color on image
}
Canvas canvas = new Canvas(_alteredBitmap);
Paint paint = new Paint();
Matrix matrix = new Matrix();
canvas.drawBitmap(bmp, matrix, paint);
imageView.setImageBitmap(_alteredBitmap); // we can also use imageView.setImageResource(R.drawable.test_image);
// ******* clear bitmap after use *******
// check after done this step it will not produce any problem
if (bmp != null) {
bmp.recycle();
bmp = null;
}
}
_alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888);
在这行代码中,我遇到了异常,以下是日志信息:
01-27 19:12:33.590 27252-27252/? E/AndroidRuntime: FATAL EXCEPTION: main
java.lang.OutOfMemoryError
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:640)
at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
at com.yptech.myfloodfilldemo.ui.MainActivity.setImageToImageView(MainActivity.java:387)
at com.yptech.myfloodfilldemo.ui.MainActivity.onCreate(MainActivity.java:96)
at android.app.Activity.performCreate(Activity.java:5008)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
at android.app.ActivityThread.access$600(ActivityThread.java:130)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4745)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
at dalvik.system.NativeStart.main(Native Method)
编辑图片后,我保存这张图片,所以不希望降低图片质量,因此我使用了Bitmap.Config.ARGB_8888。我尝试了许多解决方案,如在位图上android开发者文档中提到的方法,但它对我没有用。
OutOfMemoryError是否取决于图像大小和尺寸???如何解决createBitmap时的OutOfMemoryError问题?
当我使用largeHeap时,它可以正常工作,但是使用android:largeHeap="true"是否更好?
提前感谢 :)