【问题标题】:Null Pointer Exception in combining two Bitmap Images合并两个位图图像时出现空指针异常
【发布时间】:2012-04-10 12:58:43
【问题描述】:

我正在使用combine two Bitmap Images 的方法并写入SDCard。应用程序。在模拟器中工作正常,但是当我尝试在 Real Device 上执行时,它通过 Null Pointer Exception 在这一行 cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); 即创建一个 new Bitmap ,我将在其上绘制要组合使用的两个图像Canvas

现在,在combineImages(Bitmap background, Bitmap foreground) 中,第一个参数是Bitmap from Camera 图片和second is the forefround Gallery item。从相机拍摄的位图是static Bitmap,我想这是唯一让我陷入困境的事情。那么,谁能给我一个很好的解决方案,将Camera 拍摄的照片保存为temporary 存储,这样我就不会再使用它了。

public void combineImages(Bitmap background, Bitmap foreground) { 

        Bitmap cs = null;
        int width = 0, height = 0;
        width = background.getWidth();
        height = background.getHeight();
        cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas comboImage = new Canvas(cs);
        comboImage.drawBitmap(background, 0, 0, null);
        comboImage.drawBitmap(foreground, 100, 300, null);

        String tmpImg = String.valueOf(System.currentTimeMillis()) + ".png";
        OutputStream os = null;
        try {
            os = new FileOutputStream(Environment.getExternalStorageDirectory() + File.separator + tmpImg);
            cs.compress(CompressFormat.PNG, 100, os);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

这是我在真实设备上尝试时的 Logcat 输出。(LG Optimus Black P-970)

10-04 12:36:08.329: ERROR/AndroidRuntime(16356): FATAL EXCEPTION: main
10-04 12:36:08.329: ERROR/AndroidRuntime(16356): java.lang.NullPointerException
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.graphics.Bitmap.createBitmap(Bitmap.java:469)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at com.cam.GalleryImageSelected.combineImages(GalleryImageSelected.java:66)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at com.cam.GalleryImageSelected$1.onClick(GalleryImageSelected.java:90)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at com.android.internal.app.AlertController$AlertParams$3.onItemClick(AlertController.java:874)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.widget.AdapterView.performItemClick(AdapterView.java:294)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.widget.ListView.performItemClick(ListView.java:3387)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2408)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.os.Handler.handleCallback(Handler.java:587)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.os.Handler.dispatchMessage(Handler.java:92)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.os.Looper.loop(Looper.java:123)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at android.app.ActivityThread.main(ActivityThread.java:4627)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at java.lang.reflect.Method.invokeNative(Native Method)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at java.lang.reflect.Method.invoke(Method.java:521)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:876)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:634)
10-04 12:36:08.329: ERROR/AndroidRuntime(16356):     at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 那么我能知道投反对票的原因吗?
  • 你确定行中的宽度和高度 cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);大于 0。只是似乎无法想到该行中的另一个错误。
  • 是的,因为高度和宽度来自相机拍摄的照片,所以显然它们大于0。谢谢。

标签: android


【解决方案1】:

我想问题可能是您通过从相机拍照生成的位图的大小。所以,最好尝试使用Bitmap.createScaledBitmap() 方法。

width = getWindowManager().getDefaultDisplay().getWidth();
height = getWindowManager().getDefaultDisplay().getHeight();

background = Bitmap.createScaledBitmap(background, width, height, true);

这将根据设备高度宽度的高度宽度缩放您的图像。希望这会有所帮助。

【讨论】:

  • 谢谢,问题是图像的大小超过了设备高度宽度的大小......
【解决方案2】:

假设Bitmap 已正确实现,您基本上无法在您指定的行获得空指针异常:

cs = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

createBitmap 是静态的。 Bitmap.Config.ARGB_8888 是静态的。 宽度,高度是整数。

什么可能是空的?你能发布异常的堆栈跟踪吗?你确定这条线吗?

【讨论】:

  • 请检查我的 Logcat 输出,我在第 66 行遇到错误,这是我所指出的。
  • 似乎是位图 API 类中的实现错误。其他人也遇到过同样的错误:github.com/guardianproject/SecureSmartCam/issues/73forum.xda-developers.com/showthread.php?t=613835可能是内存问题:调用原生bitmap create时内存不足,bitmap没有创建,返回null。 Bitmap 类不检查返回的位图是否为空,并尝试设置一些参数。尝试使用较小的图像,或者在调用该方法之前尝试释放内存。
  • 我想肯定会有一些解决方案。 :(
  • 所有 createBitmap() 方法都依赖本机实现来分配内存。如果 createNative 方法无法创建位图,那么我无法想象一种解决方法。您可以重复使用您的位图对象,例如使用背景或前景来进行组合。
  • 您也可以在不再使用位图时尝试调用 Bitmap.recycle()。这样就可以释放原生分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多