java.lang.OutOfMemoryError在创建位图时发生

16 浏览
0 Comments

java.lang.OutOfMemoryError在创建位图时发生

你好,我正在创建一个图像编辑应用程序,我正在为画布和ImageView创建位图。我在ImageView中使用了一个大小为2000x2000像素的385kb图像文件。这是图片:\"enter。我的问题是,第一次我使用其他小图像创建位图并编辑图像时,它有时能正常工作,但第二次使用上述大小和尺寸时,会生成java.lang.OutOfMemoryError错误 :(。以下是相关方法的代码:\n@Override\nprotected void onCreate(Bundle savedInstanceState) {\n super.onCreate(savedInstanceState);\n setContentView(R.layout.activity_main);\n // 初始化变量\n init();\n // 初始化视图\n initView();\n // 初始化视图的事件监听器\n initEventListener();\n setImageToImageView(ims);\n}\nprivate void init() {\n context = MainActivity.this;\n db_colorImage = new DB_ColorImage(context);\n AppUtils.setColorPreference(MainActivity.this, AppConstant.PREF_COLOR_PIC, \"FF0000\");\n AppUtils.setComboColorPreference(MainActivity.this, AppConstant.PREF_COMBO, 1);\n openCatId = getIntent().getIntExtra(\"open_cat_id\", -1);\n openCat = getIntent().getStringExtra(\"image_categoryname\");\n openImgName = getIntent().getStringExtra(\"img_name\");\n db_colorImage.openDB();\n db_colorImage.startTransaction();\n assetsImgxx = db_colorImage.getXXX(openCatId);\n db_colorImage.successfullTransaction();\n db_colorImage.completeTransaction();\n db_colorImage.closeDB();\n assetsAndSdImage = new ArrayList<>(getIntent().getStringArrayListExtra(\"again\")); // aa list edit karelu with sdcard image\n try {\n ims = getAssets().open(openCat + \"/\" + openImgName);\n } catch (IOException e) {\n File getFromSd = new File(AppUtils.appFolder() + File.separator + openImgName);\n try {\n ims = new FileInputStream(getFromSd);\n } catch (FileNotFoundException e1) {\n e1.printStackTrace();\n }\n e.printStackTrace();\n }\n}\npublic void setImageToImageView(InputStream ims) {\n Drawable d = Drawable.createFromStream(ims, null);\n BitmapDrawable drawable = (BitmapDrawable) d;\n Bitmap bmp = drawable.getBitmap();\n if (bmp != null) {\n _alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888);\n }\n Canvas canvas = new Canvas(_alteredBitmap);\n Paint paint = new Paint();\n Matrix matrix = new Matrix();\n canvas.drawBitmap(bmp, matrix, paint);\n imageView.setImageBitmap(_alteredBitmap);\n // ******* 使用后清除位图 *******\n // 在完成此步骤后检查是否会产生任何问题\n if (bmp != null) {\n bmp.recycle();\n bmp = null;\n }\n}\n在这一行_alteredBitmap = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), Bitmap.Config.ARGB_8888);,我遇到了异常,这里是日志:\n01-27 19:12:33.590 27252-27252/? E/AndroidRuntime: FATAL EXCEPTION: main\n java.lang.OutOfMemoryError\n at android.graphics.Bitmap.nativeCreate(Native Method)\n at android.graphics.Bitmap.createBitmap(Bitmap.java:640)\n at android.graphics.Bitmap.createBitmap(Bitmap.java:620)\n at com.yptech.myfloodfilldemo.ui.MainActivity.setImageToImageView(MainActivity.java:387)\n at com.yptech.myfloodfilldemo.ui.MainActivity.onCreate(MainActivity.java:96)\n at android.app.Activity.performCreate(Activity.java:5008)\n at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)\n at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)\n at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)\n at android.app.ActivityThread.access$600(ActivityThread.java:130)\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)\n at android.os.Handler.dispatchMessage(Handler.java:99)\n at android.os.Looper.loop(Looper.java:137)\n at android.app.ActivityThread.main(ActivityThread.java:4745)\n at java.lang.reflect.Method.invokeNative(Native Method)\n at java.lang.reflect.Method.invoke(Method.java:511)\n at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)\n at dalvik.system.NativeStart.main(Native Method)\n编辑图像后,我会保存此图像,因此我不想降低图像质量,所以我使用了Bitmap.Config.ARGB_8888。我尝试了很多解决方案,例如在位图上使用Android开发者文档中的方法,但对我没有起作用。OutOfMemoryError是否取决于图像大小和尺寸?如何解决createBitmap时的OutOfMemoryError问题?当我使用largeHeap时,它正常工作,但使用android:largeHeap=\"true\"是更好的方法吗?提前感谢 🙂

0
0 Comments

在使用Android开发过程中,有时候会遇到java.lang.OutOfMemoryError when createBitmap的问题,这个错误通常是因为内存不足导致的。下面是一个解决该问题的方法,可以在AndroidManifest.xml文件中添加以下代码:

<application
    ...
    android:largeHeap="true">
    <activity
        android:name=".MainActivity"
        ...

但是,这种方法并不是一个好的做法。在开发中,应该优化应用程序以减少内存的使用,而不是直接增加堆内存。如果应用程序被正确地优化了,通常是不需要使用largeHeap属性的。例如,你所提到的385kb的图像应该可以在每台手机上流畅地加载。

根据你提供的信息,在尝试加载一个2000x2000像素的图像时,使用了Bitmap.Config.ARGB_8888来创建Bitmap对象。根据文档,ARGB_8888每个像素占用4个字节,所以2000*2000*4字节=15.25Mb的数据量。这就是为什么你会遇到OutOfMemoryError的原因,因为对于一个只有385kb的图像来说,这是非常大的内存开销。

根据你的需求,你正在尝试创建一个颜色填充的应用程序,所以你使用了一个库来填充图像的颜色。根据这个库的要求,你需要设置Bitmap.Config.ARGB_8888来获得高质量的颜色填充效果,这就是为什么你使用了这个值来创建Bitmap对象。然而,由于内存不足,你遇到了异常。

感谢Simon的回答,他提供的解决方法可以解决这个问题。非常感谢你的帮助!但是根据Żygłowicz的建议,使用android:largeHeap="true"并不是一个好的做法。

0
0 Comments

java.lang.OutOfMemoryError when createBitmap是在使用Glide加载大型位图时出现的问题。这个错误发生在尝试创建位图时,由于内存不足而导致的。

造成这个问题的原因是当使用Glide加载大型位图时,由于位图的大小超过了设备的可用内存限制,导致内存不足,从而引发了OutOfMemoryError。

为了解决这个问题,有几种方法可以尝试:

1. 调整所需的位图尺寸:减小所需的位图尺寸,可以通过降低宽度和高度来减少位图的内存占用。可以根据实际需求调整所需的宽度和高度,以兼顾内存和显示效果。

val neededHeight = 600

val neededWidth = 800

2. 使用合适的压缩选项:Glide提供了一些压缩选项,可以减小位图的内存占用。可以尝试使用以下选项之一:

- `.downsample()`: 这个选项可以在加载位图时将其降低采样率,从而减小内存占用。

- `.format()`: 这个选项可以指定位图的像素格式,选择一个合适的像素格式可以减小内存占用。

3. 使用`.into()`方法替代`.submit().get()`:在使用Glide时,可以尝试使用`.into()`方法将位图加载到指定的ImageView中,而不是使用`.submit().get()`方法。这样可以避免在主线程中进行同步的位图加载操作,从而减轻了内存压力。

GlideApp

.with(context)

.asBitmap()

.load(myUri)

.override(neededWidth, neededHeight)

.into(imageView)

通过调整位图尺寸、使用合适的压缩选项以及使用合适的Glide方法,可以有效地解决java.lang.OutOfMemoryError when createBitmap错误,从而实现高效加载大型位图的需求。

0
0 Comments

java.lang.OutOfMemoryError when createBitmap是在创建位图时出现的内存不足错误。造成这个问题的原因是在使用位图之前没有对其进行优化。解决方法是在使用位图之前对其进行优化。

可以通过以下方式优化位图:

Bitmap bitmap = MediaOptimize.reduceResolution(mediaPath, width, height);

在reduceResolution方法中,对位图进行了优化处理。首先,根据给定的视图宽度和高度,计算出所需的宽度和高度。然后,使用BitmapFactory.Options类来解码文件,以获取位图的实际宽度和高度。接下来,根据视图宽高比和位图宽高比的大小关系,计算出实际的宽度和高度。然后,计算出合适的采样比例,将其设置到BitmapFactory.Options中。最后,使用计算出的采样比例,解码文件得到优化后的位图。

在calculateInSampleSize方法中,根据所需的宽度和高度与位图的实际宽度和高度进行比较,计算出合适的采样比例。最后,返回采样比例。

此外,还可以通过以下方式优化位图的质量:

- 使用设备的分辨率限制,不要超过设备支持的最大宽度和高度。

- 使用BitmapFactory的其他方法进行位图的处理,如decodeStream方法。

这样可以避免在创建位图时出现内存不足的错误,并且不会损失图像质量。

0