I am making the camer application which can composite the camera preview and png.
I would like to save the images in onPictureTaken callback
my source is below
public void onPictureTaken(byte[] data, Camera camera) {
//preview from camera
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length);
// overlay image
Bitmap overlayBmp = overlay.getDrawingCache();
//blank beatmap
Bitmap blankBitmap =
Bitmap.createBitmap(bitmap.getWidth(),bitmap.getHeight(),
Bitmap.Config.ARGB_8888);
//make canvas
Canvas canvas = new Canvas(blankBitmap);
//composite image
canvas.drawBitmap(bitmap, null,new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight()), null);
canvas.drawBitmap(overlayBmp, null,new Rect(0, 0, bitmap.getWidth(),
bitmap.getHeight()), null);
However it shows outofmemoryerror,how can I solve this problem..?
05-20 15:13:49.114: E/AndroidRuntime(31647): FATAL EXCEPTION: main
05-20 15:13:49.114: E/AndroidRuntime(31647): java.lang.OutOfMemoryError
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.nativeCreate(Native Method)
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.createBitmap(Bitmap.java:605)
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.graphics.Bitmap.createBitmap(Bitmap.java:585)
05-20 15:13:49.114: E/AndroidRuntime(31647): at com.example.firstcameraappli.MainActivity$2.onPictureTaken(MainActivity.java:103)
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:750)
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.os.Handler.dispatchMessage(Handler.java:99)
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.os.Looper.loop(Looper.java:137)
05-20 15:13:49.114: E/AndroidRuntime(31647): at android.app.ActivityThread.main(ActivityThread.java:4514)
05-20 15:13:49.114: E/AndroidRuntime(31647): at java.lang.reflect.Method.invokeNative(Native Method)
05-20 15:13:49.114: E/AndroidRuntime(31647): at java.lang.reflect.Method.invoke(Method.java:511)
05-20 15:13:49.114: E/AndroidRuntime(31647): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
Anup Cowkur :
This is a well known issue on Android. The problem is that manipulating bitmaps requires more memory than is available in most devices. You can use certain tricks however. Some discussions and solutions to help you:\n\n\nStrange out of memory issue while loading an image to a Bitmap object\nhttp://android-developers.blogspot.de/2009/01/avoiding-memory-leaks.html\njava.lang.OutOfMemoryError: bitmap size exceeds VM budget - Android\nOutofMemoryError: bitmap size exceeds VM budget (Android)\n",
2013-05-20T06:30:43
Mr.Sandy :
Try this code....\n\nPictureCallback myPictureCallback_JPG = new PictureCallback()\n{\n\n @Override\n public void onPictureTaken(byte[] data, Camera arg1) {\n\n BitmapFactory.Options opt;\n\n opt = new BitmapFactory.Options();\n opt.inTempStorage = new byte[16 * 1024];\n Parameters parameters = arg1.getParameters();\n Size size = parameters.getPictureSize();\n\n int height11 = size.height;\n int width11 = size.width;\n float mb = (width11 * height11) / 1024000;\n\n if (mb > 4f)\n opt.inSampleSize = 4;\n else if (mb > 3f)\n opt.inSampleSize = 2;\n\n //preview from camera\n Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt); \n\n\n }\n}\n\n\nget image in bitmap then you use as per your requirements.",
2013-05-20T06:36:55