【问题标题】:outofmemoryerror while making bitmap制作位图时出现内存不足错误
【发布时间】:2013-05-20 06:26:40
【问题描述】:

我正在制作可以合成相机预览和png的相机应用程序。

我想将图片保存在 onPictureTaken 回调中

我的来源在下面

    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); 

但是它显示outofmemoryerror,我该如何解决这个问题..?

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)

【问题讨论】:

  • 好像是内存泄漏。捕获的图像的大小是多少

标签: android camera out-of-memory


【解决方案1】:

试试这个代码....

PictureCallback myPictureCallback_JPG = new PictureCallback()
{

    @Override
    public void onPictureTaken(byte[] data, Camera arg1) {

        BitmapFactory.Options opt;

        opt = new BitmapFactory.Options();
        opt.inTempStorage = new byte[16 * 1024];
        Parameters parameters = arg1.getParameters();
        Size size = parameters.getPictureSize();

        int height11 = size.height;
        int width11 = size.width;
        float mb = (width11 * height11) / 1024000;

        if (mb > 4f)
            opt.inSampleSize = 4;
        else if (mb > 3f)
            opt.inSampleSize = 2;

        //preview from camera
        Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,opt); 


    }
}

在位图中获取图像,然后根据您的要求使用。

【讨论】:

  • 谢谢桑迪普! inSampleSize 对我来说是一个很好的提示,但我认为问题不仅仅发生在“BitmapFactory.decodeByteArray”时。 canvas.drawBitmap(bitmap, null,new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()), null)中有outofmemoryerror;我该如何解决这个问题?
  • 我认为 drawBitmap() 是您的自定义方法。
  • createBitmap 仍然显示 outofmemoryerror Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);
  • 当我使用小数字 ((ex)100,100) 而不是 (v.getLayoutParams().width, v.getLayoutParams().height) 时。它有效。我可以使用 opt 的 createBitmap 方法吗?
  • @naveed ahmed 欢迎您在这里获得解决方案。我之所以这么说是因为很多人都遇到了这个问题,他们可以在这里得到解决方案。
【解决方案2】:

这是 Android 上的一个众所周知的问题。问题是操作位图需要比大多数设备更多的内存。但是,您可以使用某些技巧。一些可以帮助您的讨论和解决方案:

【讨论】:

    【解决方案3】:

    如果你想将图像保存到 sdcard,试试这样

    public void onPictureTaken(byte[] data, Camera camera) {
                camera.startPreview();
                FileOutputStream outStream = null;
                try {
                    outStream = new FileOutputStream(
                            "/mnt/sdcard/mypicture.png");
                    outStream.write(data);
                    outStream.close();
                    Log.d("Log", "onPictureTaken - wrote bytes: " + data.length);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
    
                } catch (IOException e) {
                    e.printStackTrace();
                } finally {
    
                }
    
            }
    

    【讨论】:

      猜你喜欢
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-12
      相关资源
      最近更新 更多