android拍照获得图片及获得图片后剪切设置到ImageView

ok,这次的项目需要用到设置头像功能,所以做了个总结,直接进入主题吧。

先说说怎么

  • 使用android内置的相机拍照然后获取到这张照片吧

直接上代码:

Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/zxy/image/temp.png"));
// 指定照片保存路径(SD卡),temp.jpg为一个临时文件,每次拍照后这个图片都会被替换
intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);
startActivityForResult(intentFromCapture,CAMERA_REQUEST_CODE);

MediaStore.ACTION_IMAGE_CAPTURE是调用系统内置的相机,有关相应功能的Action字符串的请看我的另外一篇博文,《

Android开发之Intent.Action 各种Action的常见作用

》,然后用MediaStore.EXTRA_OUTPUT的Action,告诉系统需要放入一个媒体文件,那么,这个媒体文件放在哪里呢?就是通过Uri告诉它的,我们把拍照后的图片放在手机内置sd卡根目录的zxy目录下的image目录下,并指定该照片的名称为temp.png,目录显示为:/storage/sdcard0/zxy/image/temp.png。然后通过Uri.fromFile(File file)方法得到一个File对象的Uri,这样,我们就把刚刚拍的照片放在了/storage/sdcard0/zxy/image目录下。

那么,我们怎么得到这张图片呢?

1、如果是我们拍照后,要直接使用这张图片作为什么背景图、头像啊等等,一般这个用的最多,我们就可以通过我们刚刚传入的请求码来判断和设置这种图片,这就需要重写Activity的onActivityResult()方法,直接上代码:

@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode != Activity.RESULT_CANCELED) {//通过结果码来判断是否拍取了图片
			switch (requestCode) {//通过请求码来判断是哪个请求的数据
			case IMAGE_REQUEST_CODE:
				//.............
				break;
			case CAMERA_REQUEST_CODE://需要注意的是这里直接返回的图片信息是通过Intent data传递的,data.getData()得到该图片的uri的,然后通过该图片的uri来做相应的事
				//.............
				break;
}}}

2、如果只是单纯的照相、我们可以通过这个方法来使用,取出照片可以通过BitmapFactory.decodeFile(String pathName)传入一个图片所在路径即可得到该图片,或者通过先得到该图片的输入流,然后通过BitmapFactory.decodeStream(InputStream
is)来获得该图片.....等等,方法反正有好多的。

顺便普及一下android内部的各种方法得到的目录:

1、Environment.getExternalStorageDirectory()得到的目录为:/storage/sdcard0

2、Environment.getDataDirectory()得到的目录为:/data

3、Environment.getRootDirectory()得到的目录为:/system

我们的app应用都是安装在/data/data目录下的,而一般的数据目录我们一般创建在内置sd卡/storage/sdcard0目录下,一般都是以这个app的名称创建文件夹,再创建其它目录,一般私密的数据我们可以创建在app的目录下,即/data/data/应用包名/创建的私密数据目录。

  • 选择相册中的图片来使用选中的图片设置头像或背景,直接上代码:
Intent intentFromGallery = new Intent(Intent.ACTION_GET_CONTENT);
intentFromGallery.setType("image/*");
startActivityForResult(intentFromGallery,IMAGE_REQUEST_CODE);

Intent.ACTION_GET_CONTENT是说明这个Aciton是用来得到一个内容的,那么这个内容是什么呢?就是通过setType()来进行过滤的。然后重写Activity的onActivityResult()方法通过data.getData()得到选中图片的uri,然后可以通过这两种方式获得选中的图片:

1、通过

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri); 

来得到bitmap对象。

2、通过uri得到对应的路径,通过路径得到File文件对象或者io流来执行各个操作。

// 得到图片路径
	private String getImgPath(Intent data) {
		if (data != null) {
			Uri uri = data.getData();
			String[] pojo = { MediaStore.Images.Media.DATA };
			Cursor cursor = this.getContentResolver().query(uri, pojo, null,
					null, null);
			String path = null;
			if (cursor != null) {
				int columnIndex = cursor.getColumnIndex(pojo[0]);
				cursor.moveToFirst(); // 将光标移至开头第一个位置
				path = cursor.getString(columnIndex);
				cursor.close();
			}
			return path;
		} else {
			Toast.makeText(UserLogin.this, "你没有选择图片", Toast.LENGTH_SHORT)
					.show();
			return null;
		}
	}
  • 怎么把拍照后的图片或者在相册选取的图片先剪切然后再用剪切后的图片呢?通过传一个Uri或者路径,就可以对该图片进行剪切了。
// 裁剪图片
	public void startPhotoZoom(Uri uri) {
		Intent intent = new Intent("com.android.camera.action.CROP");//发起剪切动作
		intent.setDataAndType(uri, "image/*");//设置剪切图片的uri和类型
		intent.putExtra("crop", "true");//剪切动作的信号
		intent.putExtra("aspectX", 1);//x和y是否等比缩放
		intent.putExtra("aspectY", 1);
		intent.putExtra("outputX", 320);
		intent.putExtra("outputY", 320);//剪切后图片的尺寸
		intent.putExtra("return-data", true);//是否把剪切后的图片通过data返回
		intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());//图片的输出格式
		intent.putExtra("noFaceDetection", true);  //关闭面部识别
		//设置剪切的图片保存位置
		Uri cropUri = Uri.fromFile(new File(
				Environment.getExternalStorageDirectory().getPath() + "/zxy/image/crop.png"));
		intent.putExtra(MediaStore.EXTRA_OUTPUT,cropUri);
		startActivityForResult(intent, RESULT_REQUEST_CODE);
	}

剪切动作其实有好多参数的,这里给出一下:

Exta Options Table for image/* crop:

附加选项 数据类型 描述
crop String 发送裁剪信号
aspectX int X方向上的比例
aspectY int Y方向上的比例
outputX int 裁剪区的宽
outputY int 裁剪区的高
scale boolean 是否保留比例
return-data boolean 是否将数据保留在Bitmap中返回
data Parcelable 相应的Bitmap数据
circleCrop String 圆形裁剪区域?
MediaStore.EXTRA_OUTPUT ("output") URI 将URI指向相应的file:///...,详见代码示例
outputFormat String 输出格式,一般设为Bitmap格式:Bitmap.CompressFormat.JPEG.toString()
noFaceDetection boolean 是否取消人脸识别功能

这些参数可以随意匹配,这里我们就裁剪从相册转过来的图片,当然也可以单独做一个剪切功能,只需要穿一个uri既可。

这里图片剪切后,通过请求码来在onActivityResult()中判断,然后传过来一个Intent 类型的data数据,我们可以通过刚刚设置的剪切后图片的位置得到这张剪切后的图片,也可以通过uri得到,或者转换为路径得到,或者直接通过

Bundle extras = data.getExtras();
if (extras != null) {
Bitmap photo = extras.getParcelable("data");
Drawable drawable = new BitmapDrawable(null, photo);
}

来得到这张图片,这里我们就用这个方法来得到的,较为简便。

【注意】我们在使用剪切图片的时候,通常我们设置属性只能设置一些比较小的值,像intent.putExtra("outputX", 320);intent.putExtra("outputY", 320);剪切后图片的尺寸不能设置为过大,经测试到640就会出现卡住的现象,为什么呢?原因是在于Intent
的data域最大传递的值的大小约为1M,所以图片的BITMAP当超过1M时就会失败。通常我们只是设置头像可以用这个方法,那么如果我们要剪切显示一些比较大的图片呢?怎么做呢?

该方法就是先设置为return-data设为false,不从data域获取图片,而是越过这个桥梁,通过我们刚刚在剪切图片后设置的路径目录和名称来单独获取这个图片,就可以完美显示了。如果不设置return-data为false,那么就会默认通过data返回,从而造成卡住现像。

return-data:是将结果保存在data中返回,在onActivityResult中,直接调用intent.getdata()就可以获取值了,这里设为fase,就是不让它保存在data中

MediaStore.EXTRA_OUTPUT:由于我们不让它保存在Intent的data域中,但我们总要有地方来保存我们的图片,这个参数就是转移保存地址的,对应Value中保存的URI就是指定的保存地址。

时间: 2024-12-15 01:38:25

android拍照获得图片及获得图片后剪切设置到ImageView的相关文章

Android Studio升级到0.8.1后如何设置字体大小?

升级到0.8.1后,打开设置字体大小页面,你会发现不管是Default还是Darcula,都不允许你改变字体的大小,其实这个是因为这两个模式是Android Studio自带模式,所以不允许你改动,你要改的话要自定义自己的模式.如下图: 选中一个你想要的样式,然后点击Save as,然后在弹出的对话框中输入你自己定义的样式的名称. 然后再把Scheme name选择成你自定义的样式,这个时候就可以改了. Android Studio升级到0.8.1后如何设置字体大小?,布布扣,bubuko.co

Android拍照或从图库选择图片并裁剪

今天看<第一行代码>上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo. 一. 拍照选择图片 1.使用隐式Intent启动相机 //构建隐式Intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //调用系统相机 startActivityForResult(intent, 1); 2.处理相机拍照返回的结果 //用户点击了取消 if(data == n

Android 拍照或者从相册获取图片的实现

我们常常会用到上传头像,或者发帖子的时候选择本地图片上传的功能.这个很常见 今天因为app的需求我研究了下.现在分享下. 其实不论是通过拍照还是从相册选取都会用到Intent 这是系统提供给我们用来调用系统方法的好用工具! 首先,需要设计下我们想怎么调用系统的拍照或者选取图片的方法 我们可以点击头像或者一个按钮然后弹出一个对话框,让用户自己 选择是拍照还是选择图片(如下图) . 那这个对话框怎么写呢.通过AlertDialog来实现(我们就给这个方法起名叫dialog): //对头像操作 pri

Android Studio升级到0.8.1后怎样设置字体大小?

升级到0.8.1后.打开设置字体大小页面.你会发现无论是Default还是Darcula,都不同意你改变字体的大小.事实上这个是由于这两个模式是Android Studio自带模式,所以不同意你修改,你要改的话要自己定义自己的模式.例如以下图: 选中一个你想要的样式,然后点击Save as,然后在弹出的对话框中输入你自定义的样式的名称. 然后再把Scheme name选择成你自己定义的样式,这个时候就能够改了.

Android拍照,剪切,并放入SD卡

android拍照之后,先对图片进行一次剪切,最后将图片保存到指定的目录.在项目需要用户拍照,并对图片进行剪切后,发送到服务器端做验证.这里贴出来一个小例子,能够实现基本的功能.文章最后会给出来demo.界面上就是一个点击事件. 1.首先点击事件中启动拍照,这里写死了图片的名称.实际上可以通过在公用的类中定义一个静态变量来操作. public void tackPhoto() { String status = Environment.getExternalStorageState(); if

使用V7包后,设置ActionBar的title等的属性

最新在做一个项目,既要支持低版本的ActionBar,又要能设置ActionBar的背景,及title的颜色. 使用V7包后,Activity只能设置固定的三个Theme. @style/Theme.AppCompat , @style/Theme.AppCompat.Light., @style/Theme.AppCompat.Light.DarkActionBar 如果,此时,我加了一个绿色的ActionBar的背景,又想title的颜色是白色. int titleId = Resource

android 拍照或者图库选择 压缩后 图片 上传

通过拍照或者从相册里选择图片通过压缩并上传时很多应用的常用功能,记录一下实现过程 一:创建个临时文件夹用于保存压缩后需要上传的图片 /** * path:存放图片目录路径 */ private String path = Environment.getExternalStorageDirectory().getPath() + "/XXX/"; /** * saveCatalog:保存文件目录 */ private File saveCatalog; /** * saveFile:保存

Android拍照,相册选择图片以及Android6.0权限管理

概述 在android开发过程中,拍照或者从相册中选择图片是很常见的功能.下面要说得这个案例比较简单,用户点击按钮选择拍照或者打开相册选择图片,然后将选中的图片显示在手机上.android6.0后,推出了动态权限管理.以往我们将涉及到的权限全部写在清单文件中,只要用户安装了该程序,程序在运行过程中都会获得相应权限.android6.0后,对于一些特别敏感的权限,开发者必须在程序中进行声明.拍照和从相册选择图片都是涉及到用户隐私的敏感权限,必须在程序中进行声明. 大概的流程 创建布局文件,这里不多

Android上传图片之调用系统拍照和从相册选择图片

Android上传图片之调用系统拍照和从相册选择图片 前言: 万丈高楼平底起,万事起于微末.不知不觉距离上篇博文已近四个月,2015年12月17日下午发了第一篇博文,现在是2016年4月6日.时间间隔长的过分啊,我自己都看不下去了.原因呢?当然是自己的原因,其实是有很多时间来些博客的,但是这些时间都花在DOTA上了(还是太年轻啊).请原谅我的过错--. 一.概述: 现在几乎应用都会用到上传图片的功能,而要上传图片,首先得选择图片,本文不针对如何上传图片到服务器(每个项目与服务器交互的方式不同,因