2014-01-09 36 views
0

我正在写一个相机模块,用于拍摄照片。剪辑位图时发生OutOfMemoryError BitmapFactory.createBitmap

由于预览的宽度/高度与图片的宽度/高度不同,我需要在拍摄照片时剪切图片,使其与屏幕中显示的相同。

我用这个:

mCamera.takePicture(null, null, mJpegCallback); 

设置图像回调,然后解码和剪辑回调位图:

Bitmap originBitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
... 
Bitmap bitmap = Bitmap.createBitmap(originBitmap, 0, 0, clipWidth, clipHeight); 

然而,OutOfMemoryError发生时创建剪辑bitmap.I已经尝试了许多方式来重复使用数据,而不是复制新的位图,但它不起作用。那么,请有人能帮我吗?

+0

有没有任何限制/要求,不允许你使用相机意图API? – nikvs

+0

@nikvs,是的,这个应用程序将绑定到一个自定义的硬件,我们想要按下该设备上指定的物理按钮时拍摄的照片,相机通知API不符合我们的需要,所以我们必须自己写。 –

回答

1

Thandk你都在上面!!我解决了这个问题,android有一个名为BitmapRegionDecoder的类可以满足我的需要。我只能解码指定的区域,而不是解码整个位图,并创建一个新的剪切位图,后者很容易导致OOM。

+1

嗨@Joe我是也陷入了同样的问题。你可以请你发布你的解决方案吗?因为它对其他人来说是完整的。 – user123456

0

很多图像上的OutOfMemory异常,请搜索它。这可能是因为图像太大而无法记忆。当您收到图像时开始的好地方是:

BitmapFactory.options options = new BitmapFactory.options(); 
    options.inJustDecodeBound = true; 
    //this allows you to edit the size of the image before trying to load it into memory 
1

在应用程序标记下的清单文件中添加android:LargeHeap = true。

+0

这里是为什么你不应该去largeHeap作为OOM问题的第一个手段:[largeHeap陷阱](http://stackoverflow.com/a/11275704/2246121) – Magnus

+0

@Magnus谢谢你的信息 – anjaneya