解决方案 »
- android 如何打印插件中的日志信息
- Ubuntu10.04下下载android4.1.1源码问题
- CTP 驱动中的 ctp_detect等是如何被内核调用到的? 是如何被android4.0调用到的?
- Android读取网络图片路径包含中文,无法显示,该怎样解决?
- 如何实现两部android手机进行socket通信。。由服务器中转也可以
- 问个关于SIM卡存取内容大小的限制
- android2.2源码里带的brower和gallery支持多点触摸吗?
- 求解决一个利用HttpClient4用post连接服务器的问题,已经可以读服务器,服务器却不能收到post参数
- android使用swipeBack滑动返回时为什么会出现黑屏现象?
- 学习android的新手,在做例子中不断前行,感谢大家给我帮助,这里遇到了一个问题,恳请各位大哥大姐指教!
- 初学开发,有几个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图像处理的