2011-10-04 43 views
8

我正在使用的方法为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擎天柱黑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) 
+0

我可以知道投票的理由吗? –

+0

你确定线宽和高度cs = Bitmap.createBitmap(width,height,Bitmap.Config.ARGB_8888);大于0.似乎无法想象该行中的另一个错误。 – blessenm

+0

是的,因为高度和宽度来自相机拍摄的照片,所以显然它们大于0.谢谢。 –

回答

6

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

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

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

这会根据设备高度宽度的高度来缩放图像。希望这可以帮助。

+0

谢谢,它工作的问题是图像的大小超过了设备高度宽度的大小... –

+0

我很高兴..我可以帮助 – MKJParekh

+0

这是新的信息。谢谢 – blessenm

4

基本上,你不能在你的指示线得到一个空指针异常,假设Bitmap已正确实施:

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

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

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

+0

请检查我的Logcat输出,我收到了第66行的错误,这是我指出的。 –

+0

看起来像位图API类中的实现错误。其他人也遇到同样的错误: https://github.com/guardianproject/SecureSmartCam/issues/73 http://forum.xda-developers.com/showthread.php?t=613835 它可能是一个内存问题:调用本地位图创建时,没有足够的内存,未创建位图并返回null。 Bitmap类不检查返回的位图是否为空,并尝试设置一些参数。尝试更小的图像,或在调用方法之前尝试释放内存。 –

+0

我想可能有一些解决方案。 ( –