Android之从Camera捕获图像讲解
我们知道所有带有摄像头的设备都会附带Camera应用程序,Camera 应用程序包含一个意图过滤器,用于与Camera
应用程序图像的获取。
为了通过一个意图利用Camera应用程序,我们需要构造一个意图过滤器,可以这样定义:
Intent intent=new Intent("android.media.action.IMAGE_CAPTURE");
但在实际开发中,并不推荐这样做,这时我们可以指定MediaStore类中的常量ACTION_IMAGE_CAPTURE,使用这样
的好处是为了有利于未来的变化。因此,我们这样定义:
Intent intent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
为了从Camera应用程序中获取图像,这时,应该将startActivity更改为startActivityForResult方法:
startActivityForResult(intent, 0);
这时我们从onActivityResult方法中获取返回的数据:
@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode==RESULT_OK){ Bundle extras=data.getExtras();Bitmap bitmap=(Bitmap)extras.get("data");}}
Camera应用程序通过一个意图传递的附加值(extra)中返回图像,该意图将在onActivityRsult方法中传递给主调活
动。附加值的名称为“data”,它包含一个Bitmap对象,需要从泛型对象将它强制转换过来。
以上所得到的只是一个很小的图像,好吧,这其实得到的就是一个缩略图。
以上只是得到一个很小的缩略图,那如何获取大图的,在Android1.5开始,在大多数设备上可以将一个附加值传递给
触发Camera应用程序的意图,这个附加值的名称在MediaStore类中指定,它是一个常量,称为EXTRA_OUTPUT。
这个附加值用于指示Camera应用程序将捕获到的图像存放在什么位置。例如以下代码:
</pre><pre name="code" class="java"> String mFilePath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/bill.jap";File file=new File(mFilePath);mImageUri=Uri.fromFile(file);Intent intent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageUri);startActivityForResult(intent, 0);
加载并显示一幅图像对内存使用情况很有影响,幸好Android提供了一个名为BitmapFactory的实用程序类,该程序类
提供了一系列的静态方法,允许通过各种来源加载Bitmap图像。BitmapFactory中的可用方法将会调用
BitmapFactory.Options类,这使得我们能够定义如何将Bitmap读入内存中。当加载图像时,可以设置BitmapFactory
使用的采样大小,在BitmapFactory.Options中指定inSampleSize参数。比如:
BitmapFactory.Options option=new BitmapFactory.Options();option.inSampleSize=5;Bitmap bitmap=BitmapFactory.decodeFile(mFilePath, option);
以上是将会产生一副大小是原始图像大小1/5的图像。
这是一种加速加载大图像的方法,但是没有真正考虑图像的原始大小,也没有考虑屏幕的大小,以下是获取屏幕的尺
寸:
DisplayMetrics metrics=new DisplayMetrics();this.getWindowManager().getDefaultDisplay().getMetrics(metrics);mWindowHeight=metrics.heightPixels;mWindowWidth=metrics.widthPixels;
为了确定图像的所有尺寸,我们使用了BitmapFactory和BitmapFactory.Options,并将
BitmapFactory.Options.inJustDecodeBounds变量设置为true。这将通知BitmapFactory类只返回该图像的范围,无须
尝试解码图像本身。当使用这个方法时,BitmapFactory.Options.outHeight和BitmapFactory.Options.outWidth变量将
会被赋值,例如:
BitmapFactory.Options mBitmapFactory=new BitmapFactory.Options();mBitmapFactory.inJustDecodeBounds=true;Bitmap bitmap=BitmapFactory.decodeFile(mFilePath, mBitmapFactory);int heightRatio=(int)Math.ceil(mBitmapFactory.outHeight/(float)mWindowHeight);int widthRatio=(int)Math.ceil(mBitmapFactory.outWidth/(float)mWindowWidth);
之后可以通过高度比率或宽度比率来显示图像大小。
以下是一个完整的示例代码:
MainActivity:
public class MainActivity extends Activity {private ImageView iv_show;private Button btn_open;private Uri mImageUri;private String mFilePath;private int mWindowWidth;private int mWindowHeight;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();initEvent();initdata();}private void initdata(){mFilePath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/bill.jap";File file=new File(mFilePath);mImageUri=Uri.fromFile(file);DisplayMetrics metrics=new DisplayMetrics();this.getWindowManager().getDefaultDisplay().getMetrics(metrics);mWindowHeight=metrics.heightPixels;mWindowWidth=metrics.widthPixels;}private void initEvent(){btn_open.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Intent intent=new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mImageUri);startActivityForResult(intent, 0);}});}private void initView(){iv_show=(ImageView)findViewById(R.id.iv_show);btn_open=(Button)findViewById(R.id.btn_open);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode==RESULT_OK){/** 加载图像尺寸*/BitmapFactory.Options mBitmapFactory=new BitmapFactory.Options();mBitmapFactory.inJustDecodeBounds=true;Bitmap bitmap=BitmapFactory.decodeFile(mFilePath, mBitmapFactory);int heightRatio=(int)Math.ceil(mBitmapFactory.outHeight/(float)mWindowHeight);int widthRatio=(int)Math.ceil(mBitmapFactory.outWidth/(float)mWindowWidth);/** 判断图像是否超出屏幕*/if(heightRatio>1&&widthRatio>1){if(heightRatio>1){mBitmapFactory.inSampleSize=heightRatio;}else{mBitmapFactory.inSampleSize=widthRatio;}}/** 进行解码*/mBitmapFactory.inJustDecodeBounds=false;bitmap=BitmapFactory.decodeFile(mFilePath, mBitmapFactory);iv_show.setImageBitmap(bitmap);}}}
布局文件(activity_main):
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent" ><ScrollViewandroid:layout_width="fill_parent"android:layout_height="fill_parent" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><Buttonandroid:id="@+id/btn_open"android:layout_width="fill_parent"android:layout_height="50dp"android:text="Open" /><ImageViewandroid:id="@+id/iv_show"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout></ScrollView></RelativeLayout>
最后别忘了给AndroidManifest添加相应的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
转载请注明出处:http://blog.csdn.net/hai_qing_xu_kong/article/details/45696873情绪控_
Android之从Camera捕获图像讲解相关推荐
- android开发皮肤检测,android – 检测皮肤和捕获图像
更新1 我知道inRange函数的作用.但我不想应用蒙版并用肤色显示新图像.我想要做的是知道图像是否包含肤色并覆盖更大的区域. 我想做的事 我想在边界内检测到手指时拍摄照片.它的尺寸是已知的. 苦苦挣 ...
- android 崩溃捕获_Android从相机和图库捕获图像
android 崩溃捕获 In this tutorial we'll develop an application that picks an image from camera or galler ...
- android 崩溃捕获_Android使用FileProvider捕获图像相机图库
android 崩溃捕获 In this tutorial, we'll be developing an application which displays images captured fro ...
- [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现
http://blog.csdn.net/candycat1992/article/details/21617741 实现 以OpenCV的JavaCameraView为例,首先需要定制自己的Came ...
- 从Android上的相机裁剪图像
目录 介绍 使用代码 下载源代码 - 1 MB 介绍 基本思路非常简单: 显示相机预览 添加矩形视图到相机预览(新裁剪图像的边界) 裁剪图像并将结果保存到文件中 使用代码 让我们开始吧!在Androi ...
- 【Android Camera2】玩转图像数据 -- NV21图像旋转,镜像,转rgba代码分析,性能优化
[Android Camera2]玩转图像数据 业务场景介绍 NV21数据旋转 逐像素遍历法 NV21数据镜像 逐像素遍历法 中心翻转法 NV21转RGB/RGBA数据 逐像素遍历法 NV21组合操作 ...
- Android中使用Camera类编写手机拍照App的实例教程
Camera是Android摄像头硬件的相机类,位于硬件包"android.hardware.Camera"下.它主要用于摄像头捕获图片.启动/停止预览图片.拍照.获取视频帧等,它 ...
- 解读Android 4.0 Camera原生应用程序的设计思路
解读Android 4.0 Camera原生应用程序的设计思路 一篇很不错的文章: http://my.oschina.net/jerikc/blog/90791 1. 设置摄像头方向 2. 打开线程 ...
- Camera DVP协议讲解
Camera DVP协议讲解 该文章写于2016年,一直未发表.近期工作中又涉及到了Camera相关的内容,重新温习了下相关知识.决定把这篇文章发表出来,大家共同学习. DVP(Digital V ...
最新文章
- python编的俄罗斯方块游戏下载_python写的俄罗斯方块游戏
- vue项目中keep-alive的使用,从详情页返回列表时保存浏览位置
- 用PAM实现用户和主机的Samba访问控制
- Maven_1.了解Maven以及其安装配置
- 关于「Xception」和「DeepLab V3+」的那些事
- 数据处理程序的一点经验
- c语言随机生成int64_t类型的数据_手把手教你代码生成(上):MATLAB代码生成
- 5.一文搞懂MySQL的数据类型
- Android开发推荐资料大合集
- Linux阻塞和同步机制
- 【maven】idea左侧External Libraries里,没有Maven的依赖包 代码飘红
- 关于字符匹配所引起的的问题
- web优化之-asp.net js延迟加载 js动态合并 js动态压缩
- dumpsys命令用法
- PHP远程操纵Wordpress的方法(流程剖析)
- SpringBoot前后端分离登陆验证码实现以及不显示问题
- idea各工作区背景颜色设置
- 网易云音乐 网络错误 linux,解决ubuntu安装网易云音乐失败的方法
- 用Audacity分析浊音、清音、爆破音的时域及频域特性
- 安卓电子市场_五款安卓工具神器
热门文章
- win7 计算机右键没有属性,系统之家windows7旗舰版计算机上右键菜单没有属性怎么办?...
- 电子商务中遇到组合搜索的问题
- Nacos系列:Nacos的三种部署模式
- StringUtils之equals
- 已知/未知宽高的浮动元素水平居中对齐 和 图片水平垂直居中对齐
- Mysql 5.7 liunx 忘记密码的补救方法
- linux系统启动流程详解
- mysql视图学习总结
- Hackerrank GCD Product(莫比乌斯反演)
- 2018-07-09--记录一次gitlab迁移事件及遇到的问题