相机获取图像的格式问题

android中承认的格式的参考网址为 :http://developer.android.com/reference/android/graphics/ImageFormat.html);

并不是所有的android摄像机都支持这种格式,其中最为常用(android系统默认)的格式为:NV21格式;(所有相机都支持)。但是往往我们需要将这种格式转化为其它的类型,以便于进行相关处理,最常见的就是rgb和jpeg类型,还有android中的BitMap 格式的图像类型。NV21格式其实是一种YUV格式,相关格式的说明可参考网络资料~,下面帖一下相关算法:

public void decodeToBitMap(byte[] data, Camera _camera) {

Size size = mCamera.getParameters().getPreviewSize();

try {

YuvImage image = new YuvImage(data, ImageFormat.NV21, size.width,

size.height, null);

if (image != null) {

ByteArrayOutputStream stream = new ByteArrayOutputStream();

image.compressToJpeg(new Rect(0, 0, size.width, size.height),

80, stream);

Bitmap bmp = BitmapFactory.decodeByteArray(

stream.toByteArray(), 0, stream.size());

stream.close();

}

} catch (Exception ex) {

Log.e("Sys", "Error:" + ex.getMessage());

}

}

注意:该算法只适用于android2.2以后的版本~

——————————————————————————————————————

另外帖出一篇网文,仅供参考者图像格式详解网址:http://ticktick.blog.51cto.com/823160/555791

算法网址:http://www.cnblogs.com/lyout/archive/2012/03/16/2400370.html

本次摘录网址 :

上次讲的是摄像头的初始化,如果觉得这么就万事OK的话,那就大错特错了。接下来的东西让人感到更加头痛。

在我的这个应用里,不需要把拍下来的图片存储,只需要把预览的图片数据处理一下就好,很自然的我只是用了onPreviewFrame

调用,考虑处理传递进来的data数据流就是了。

网上很多帖子都说,然后用BitmapFactory的decodeByteArray()函数来解析图片就行了,我试了一下,发现这真是彻头彻尾 的谎

言,data字节流默认是YCbCr_420_SP(虽然可以改,但其他的格式未必兼容),decodeByteArray()压根儿不 认!SDK2.2之后,

似乎提供了一个YuvImage的类来转一下(那Google一开始提供这个借口是做什么的?),难道就要把老机给抛弃了么??万 万不

能啊(穷人最理解穷人们了)!

好在这个世界总是不缺少好人和牛人的,有人提供了这么一段转换的代码:

上次讲的是摄像头的初始化,如果觉得这么就万事OK的话,那就大错特错了。接下来的东西让人感到更加头痛。

在我的这个应用里,不需要把拍下来的图片存储,只需要把预览的图片数据处理一下就好,很自然的我只是用了onPreviewFrame

调用,考虑处理传递进来的data数据流就是了。

网上很多帖子都说,然后用BitmapFactory的decodeByteArray()函数来解析图片就行了,我试了一下,发现这真是彻头彻尾 的谎

言,data字节流默认是YCbCr_420_SP(虽然可以改,但其他的格式未必兼容),decodeByteArray()压根儿不 认!SDK2.2之后,

似乎提供了一个YuvImage的类来转一下(那Google一开始提供这个借口是做什么的?),难道就要把老机给抛弃了么??万 万不

能啊(穷人最理解穷人们了)!

好在这个世界总是不缺少好人和牛人的,有人提供了这么一段转换的代码:

我不是很清楚这里面的原理,但是它能在我这里工作,暂时可以了……然后你才可以吧处理完的rgb[]传给decodeByteArray()。

顺便好心的把使用SDK2.2之后的也贴上吧,万一有用呢……

哦,得到的图像旋转了90°(似乎有的机型设置一下setRotation(90)可以搞定,但还是那句话,不通用啊,况且这个是2.1之后 的API)。手动转一下吧……

——————注:经本人验证,并没有出现旋转90°的问题。。。

Matrix matrix = new Matrix();

matrix.postRotate(90);

// 这里的rgb就是刚刚转换处理的东东

Bitmap bmp = Bitmap.createBitmap(rgb, 0, w, w, h, Bitmap.Config.ARGB_4444);

Bitmap nbmp = Bitmap.createBitmap(bmp,

0, 0, bmp.getWidth(), bmp.getHeight(), matrix, true);

终于正常了~~~

考虑到需要做识别,自然得先把它转成灰度图像,经典心理公式Gray = R*0.299 + G*0.587 + B*0.114出场了,但是手机的计算

速度不那么快,这样的浮点运算还是尽量避免吧~ 于是考虑Gray = (R*299 + G*587 + B*114 + 500) / 1000或者Gray = (R*30 +

G*59 + B*11 + 50) /

原地址:http://www.cnblogs.com/mengyan/archive/2012/09/01/2666641.html

更多相关文章

  1. 如何修改Android的Bitmap
  2. react-native 热更新(android)
  3. android中ImageView的ScaleType属性
  4. Android模拟 HTTP multipart/form-data 请求协议信息实现图片上
  5. MIUI 惊艳锁屏样式5款[Android] | 小众软件 > Android
  6. Android(安卓)android:scaleType属性 图片按比例缩放
  7. Android(安卓)相机拍照获取图片并保存到指定位置。
  8. Android(安卓)Selector
  9. Android加载/处理超大图片神器!SubsamplingScaleImageView(subsam

随机推荐

  1. 【Android】8.1 主题基本用法
  2. android自定义带下划线EditText
  3. Sensor.TYPE_ORIENTATION 方向传感器,转向
  4. android解决内存溢出的问题(没有从根本上
  5. android pagerView
  6. SharedPreferences存与取,
  7. Android(安卓)N 7.x起 APP分屏模式 问题
  8. android : 深入理解intent-filter的actio
  9. Android(安卓)Update Engine分析(七) Downl
  10. Fatal signal 11 (SIGSEGV) at 0xdeadbaa