求解自定义相机短时间拍多张照片导致OOM如何解决 oombitmapcamera相机 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 我做过的是操作Camera类的mCamera.setPreviewCallback方法的Camera.PreviewCallback回调接口的onPreviewFrame方法其中有个参数是byte[] data,就是每帧图像的byte数组,对其进行旋转如果知道设置过每帧动画的数据类型,例如设置了parameters.setPreviewFormat(ImageFormat.YV12);//Camera.Parameters parameters因为下面的旋转算法是对yv12,如果是图像是nv21算法有些类似,但需要修改下(原因是图像数据排列方式不同)。你可以百度一下下面贴一下yv12的旋转算法(逆时针旋转90度)/** * 旋转数据 * * @param dst * 目标数据 * @param src * 源数据 * @param srcWidth * 源数据宽 * @param height * 源数据高 */ private void YV12RotateNegative90(byte[] dst, byte[] src, int srcWidth, int height) { int t = 0; int i, j; int wh = srcWidth * height; for (i = srcWidth - 1; i >= 0; i--) { for (j = height - 1; j >= 0; j--) { dst[t++] = src[j * srcWidth + i]; } } for (i = srcWidth / 2 - 1; i >= 0; i--) { for (j = height / 2 - 1; j >= 0; j--) { dst[t++] = src[wh + j * srcWidth / 2 + i]; } } for (i = srcWidth / 2 - 1; i >= 0; i--) { for (j = height / 2 - 1; j >= 0; j--) { dst[t++] = src[wh * 5 / 4 + j * srcWidth / 2 + i]; } } } 能否求告知一下如何知道图片是yv21还是nv21,还有我旋转的角度不是固定的,这个算法是否有出处,希望大神再指点详细些 android预览的效果默认支持为NV21和yv12,具体的你可以下面方法试着查看真机支持的格式如果支持的话可以用parameters.setPreviewFormat(ImageFormat.YV12);之类的设置格式了。List<Integer> pvFmts = parameters.getSupportedPreviewFormats();//Camera.Parameters parametersif (pvFmts == null || !pvFmts.contains(ImageFormat.NV21))//例如{ Log.v(TAG, "手机不支持ImageFormat.NV21");}关于nv21http://blog.csdn.net/vblittleboy/article/details/10945143参考过的一篇,了解uv的排列旋转的思路大概是:先对Y进行排列,再对UV进行排列,不同的编码格式的差异在于UV。我项目中用的是YV12的转换算法。排列是U在前V在后,而I420是V在前U在后,所占位子一样。NV21除了Y是一样的,UV是排列在一起的。就这么多资料了。靠你自己了 你的OOM是不是出现在Byte[]里面,你有没有试过新开一个线程就new 一个Byte[],或者用更大的数组来存储,然后把这些数组存到一个指定的地方,处理完最近一张照片的同时异步处理这些照片,同时处理的话等待时间太长了,而且容易出错。 不可能是byte数组OOM的,因为android给bitmap分配的空间是8MB左右,一张清晰的照片基本应该是2M甚至更大,所以同时decode的时候会造成内存溢出,目前估计办法只能用算法甚至往JNI方面靠拢了 http://blog.csdn.net/taotao110120119/article/details/7450561这边文章里面我觉得对你可能是有用的,而且做法比较简单,你内存泄露其实主要就是没能够及时的释放内存导致的,那为什么没能够释放内存呢?这边文章里面有提到。 我之前做相关项目的时候,也是出现OOM,后来解决了。个人觉得你的问题跟我的有点类似,你自己也觉得是同时decode的时候造成的OOM吧,所以,我才说用一个数组来存一张照片,然后后面按照你的思路走,不过,这样的话,貌似有点奢侈,多了应该也会OOM,汗,这个问题还真不好解决。加油吧,你行的!要是解决了,给个解决的思路或方案。呵呵。 因为目前在实习让做自定义相机项目,这个问题卡了两天了,有推荐直接对byte[]数组进行操作的,这个目前来说如果有算法应该是最佳的感觉,算法也肯定是有的,就是不知道去哪找,有点心烦 在每次使用完bitmap之后都有recycle和置为null,但是依旧存在OOM的问题,因为我是开线程来操作的,就可能是多条线程同时出现decode的情况,而且我查到一篇博文有说recycle不是立马回收,不知真假 在每次使用完bitmap之后都有recycle和置为null,但是依旧存在OOM的问题,因为我是开线程来操作的,就可能是多条线程同时出现decode的情况,而且我查到一篇博文有说recycle不是立马回收,不知真假这个问题可能有几个原因:1,你保存bitmap的方法有问题,如果你使用的是BitmaFactory.createBitmap这种方式,来生成图像,保存,那么,很有可能出现挂掉的情况,最好使用流操作;2,你保存过程中,是否显示图像,如果显示,那么每次都把ImageView先设置为空,比如setImageResource(0),然后在显示图像;3,如果实线程冲突了,那么你记录个boolean变量,当线程执行时,变量为true,该线程执行完毕后,为false,先一个线程开启时 做个判断即可。 在每次使用完bitmap之后都有recycle和置为null,但是依旧存在OOM的问题,因为我是开线程来操作的,就可能是多条线程同时出现decode的情况,而且我查到一篇博文有说recycle不是立马回收,不知真假这个问题可能有几个原因:1,你保存bitmap的方法有问题,如果你使用的是BitmaFactory.createBitmap这种方式,来生成图像,保存,那么,很有可能出现挂掉的情况,最好使用流操作;2,你保存过程中,是否显示图像,如果显示,那么每次都把ImageView先设置为空,比如setImageResource(0),然后在显示图像;3,如果实线程冲突了,那么你记录个boolean变量,当线程执行时,变量为true,该线程执行完毕后,为false,先一个线程开启时 做个判断即可。1.createBitmap是必须使用的吧,因为我要对图片做旋转剪裁还有缩放,就必须先从流里面加载一个图片,然后再将这个Bitamp作为source来create出最终的bitmap分享下我的解决方法便于往后需要的人参考:1.在AndroidManifest中申请largeHeap=true,向系统申请应用所能拿到的最大空间,对于图片处理软件来说这个操作应该是利大于弊的2.使用线程池进行操作,往高一点可以动态根据手机的不同内存来开启不同数量的线程3.可以考虑往JNI方面走,但是不知道使用算法后图片处理效率是否会变慢,有试过使用算法合并两张图片,时间大概要十来秒,这方面之前还没深入研究过,所以还得尝试一下希望有更好解决方法的朋友一起交流,这个应该是android系统经常会遇到的问题,帮助别人也是帮助自己,万分感谢! 在每次使用完bitmap之后都有recycle和置为null,但是依旧存在OOM的问题,因为我是开线程来操作的,就可能是多条线程同时出现decode的情况,而且我查到一篇博文有说recycle不是立马回收,不知真假这个问题可能有几个原因:1,你保存bitmap的方法有问题,如果你使用的是BitmaFactory.createBitmap这种方式,来生成图像,保存,那么,很有可能出现挂掉的情况,最好使用流操作;2,你保存过程中,是否显示图像,如果显示,那么每次都把ImageView先设置为空,比如setImageResource(0),然后在显示图像;3,如果实线程冲突了,那么你记录个boolean变量,当线程执行时,变量为true,该线程执行完毕后,为false,先一个线程开启时 做个判断即可。1.createBitmap是必须使用的吧,因为我要对图片做旋转剪裁还有缩放,就必须先从流里面加载一个图片,然后再将这个Bitamp作为source来create出最终的bitmap分享下我的解决方法便于往后需要的人参考:1.在AndroidManifest中申请largeHeap=true,向系统申请应用所能拿到的最大空间,对于图片处理软件来说这个操作应该是利大于弊的2.使用线程池进行操作,往高一点可以动态根据手机的不同内存来开启不同数量的线程3.可以考虑往JNI方面走,但是不知道使用算法后图片处理效率是否会变慢,有试过使用算法合并两张图片,时间大概要十来秒,这方面之前还没深入研究过,所以还得尝试一下希望有更好解决方法的朋友一起交流,这个应该是android系统经常会遇到的问题,帮助别人也是帮助自己,万分感谢!jni层可以 引用 CC写的图像合并算法,肯定不会那么慢你!我现在专业做jni+C图像处理的 Android UDP模式发送数据问题 Eclipse3.6.1配置ADT的时候总失败?如何解决 新浪微博android sdk 使用问题 请教一些android gallery的问题!!!!!求牛人的解答。。。。 ViewPager使用中出现的问题。 android有无深度睡眠机制??请进讨论 分享一个Android插件平台 界面失真问题 普通new 个Handler,AS会提示泄漏。 message.what 为什么自己变值了啊…… 初学开发,有几个android开发的问题请问各位大神 android短信搜索
mCamera.setPreviewCallback方法的
Camera.PreviewCallback回调接口的
onPreviewFrame方法
其中有个参数是byte[] data,就是每帧图像的byte数组,对其进行旋转如果知道设置过每帧动画的数据类型,例如设置了
parameters.setPreviewFormat(ImageFormat.YV12);//Camera.Parameters parameters
因为下面的旋转算法是对yv12,如果是图像是nv21算法有些类似,但需要修改下(原因是图像数据排列方式不同)。你可以百度一下
下面贴一下yv12的旋转算法(逆时针旋转90度)/**
* 旋转数据
*
* @param dst
* 目标数据
* @param src
* 源数据
* @param srcWidth
* 源数据宽
* @param height
* 源数据高
*/
private void YV12RotateNegative90(byte[] dst, byte[] src, int srcWidth,
int height)
{
int t = 0;
int i, j; int wh = srcWidth * height; for (i = srcWidth - 1; i >= 0; i--)
{
for (j = height - 1; j >= 0; j--)
{
dst[t++] = src[j * srcWidth + i];
}
} for (i = srcWidth / 2 - 1; i >= 0; i--)
{
for (j = height / 2 - 1; j >= 0; j--)
{
dst[t++] = src[wh + j * srcWidth / 2 + i];
}
} for (i = srcWidth / 2 - 1; i >= 0; i--)
{
for (j = height / 2 - 1; j >= 0; j--)
{
dst[t++] = src[wh * 5 / 4 + j * srcWidth / 2 + i];
}
}
}
能否求告知一下如何知道图片是yv21还是nv21,还有我旋转的角度不是固定的,这个算法是否有出处,希望大神再指点详细些
如果支持的话可以用parameters.setPreviewFormat(ImageFormat.YV12);之类的设置格式了。List<Integer> pvFmts = parameters.getSupportedPreviewFormats();//Camera.Parameters parameters
if (pvFmts == null || !pvFmts.contains(ImageFormat.NV21))//例如
{
Log.v(TAG, "手机不支持ImageFormat.NV21");
}
关于nv21
http://blog.csdn.net/vblittleboy/article/details/10945143
参考过的一篇,了解uv的排列旋转的思路大概是:
先对Y进行排列,再对UV进行排列,不同的编码格式的差异在于UV。
我项目中用的是YV12的转换算法。排列是U在前V在后,而I420是V在前U在后,所占位子一样。
NV21除了Y是一样的,UV是排列在一起的。就这么多资料了。靠你自己了
加油吧,你行的!要是解决了,给个解决的思路或方案。呵呵。
这个问题可能有几个原因:
1,你保存bitmap的方法有问题,如果你使用的是BitmaFactory.createBitmap这种方式,来生成图像,保存,那么,很有可能出现挂掉的情况,最好使用流操作;
2,你保存过程中,是否显示图像,如果显示,那么每次都把ImageView先设置为空,比如setImageResource(0),然后在显示图像;
3,如果实线程冲突了,那么你记录个boolean变量,当线程执行时,变量为true,该线程执行完毕后,为false,先一个线程开启时 做个判断即可。
这个问题可能有几个原因:
1,你保存bitmap的方法有问题,如果你使用的是BitmaFactory.createBitmap这种方式,来生成图像,保存,那么,很有可能出现挂掉的情况,最好使用流操作;
2,你保存过程中,是否显示图像,如果显示,那么每次都把ImageView先设置为空,比如setImageResource(0),然后在显示图像;
3,如果实线程冲突了,那么你记录个boolean变量,当线程执行时,变量为true,该线程执行完毕后,为false,先一个线程开启时 做个判断即可。1.createBitmap是必须使用的吧,因为我要对图片做旋转剪裁还有缩放,就必须先从流里面加载一个图片,然后再将这个Bitamp作为source来create出最终的bitmap分享下我的解决方法便于往后需要的人参考:
1.在AndroidManifest中申请largeHeap=true,向系统申请应用所能拿到的最大空间,对于图片处理软件来说这个操作应该是利大于弊的
2.使用线程池进行操作,往高一点可以动态根据手机的不同内存来开启不同数量的线程
3.可以考虑往JNI方面走,但是不知道使用算法后图片处理效率是否会变慢,有试过使用算法合并两张图片,时间大概要十来秒,这方面之前还没深入研究过,所以还得尝试一下
希望有更好解决方法的朋友一起交流,这个应该是android系统经常会遇到的问题,帮助别人也是帮助自己,万分感谢!
这个问题可能有几个原因:
1,你保存bitmap的方法有问题,如果你使用的是BitmaFactory.createBitmap这种方式,来生成图像,保存,那么,很有可能出现挂掉的情况,最好使用流操作;
2,你保存过程中,是否显示图像,如果显示,那么每次都把ImageView先设置为空,比如setImageResource(0),然后在显示图像;
3,如果实线程冲突了,那么你记录个boolean变量,当线程执行时,变量为true,该线程执行完毕后,为false,先一个线程开启时 做个判断即可。1.createBitmap是必须使用的吧,因为我要对图片做旋转剪裁还有缩放,就必须先从流里面加载一个图片,然后再将这个Bitamp作为source来create出最终的bitmap分享下我的解决方法便于往后需要的人参考:
1.在AndroidManifest中申请largeHeap=true,向系统申请应用所能拿到的最大空间,对于图片处理软件来说这个操作应该是利大于弊的
2.使用线程池进行操作,往高一点可以动态根据手机的不同内存来开启不同数量的线程
3.可以考虑往JNI方面走,但是不知道使用算法后图片处理效率是否会变慢,有试过使用算法合并两张图片,时间大概要十来秒,这方面之前还没深入研究过,所以还得尝试一下
希望有更好解决方法的朋友一起交流,这个应该是android系统经常会遇到的问题,帮助别人也是帮助自己,万分感谢!
jni层可以 引用 CC写的图像合并算法,肯定不会那么慢你!我现在专业做jni+C图像处理的