android拍照获得图片及获得图片后并裁剪

2024-09-06 01:18

本文主要是介绍android拍照获得图片及获得图片后并裁剪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

直接上代码:

[java]  view plain copy
print ?
  1. Intent intentFromCapture = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);  
  2. Uri imageUri = Uri.fromFile(new File(Environment.getExternalStorageDirectory()+"/zxy/image/temp.png"));  
  3. // 指定照片保存路径(SD卡),temp.jpg为一个临时文件,每次拍照后这个图片都会被替换  
  4. intentFromCapture.putExtra(MediaStore.EXTRA_OUTPUT,imageUri);  
  5. 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()方法,直接上代码:

[java]  view plain copy
print ?
  1. @Override  
  2.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  3.         super.onActivityResult(requestCode, resultCode, data);  
  4.         if (resultCode != Activity.RESULT_CANCELED) {//通过结果码来判断是否拍取了图片  
  5.             switch (requestCode) {//通过请求码来判断是哪个请求的数据  
  6.             case IMAGE_REQUEST_CODE:  
  7.                 //.............  
  8.                 break;  
  9.             case CAMERA_REQUEST_CODE://需要注意的是这里直接返回的图片信息是通过Intent data传递的,data.getData()得到该图片的uri的,然后通过该图片的uri来做相应的事  
  10.                 //.............  
  11.                 break;  
  12. }}}  
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/应用包名/创建的私密数据目录。

  • 选择相册中的图片来使用选中的图片设置头像或背景,直接上代码:

[java]  view plain copy
print ?
  1. Intent intentFromGallery = new Intent(Intent.ACTION_GET_CONTENT);  
  2. intentFromGallery.setType("image/*");  
  3. startActivityForResult(intentFromGallery,IMAGE_REQUEST_CODE);  
Intent.ACTION_GET_CONTENT是说明这个Aciton是用来得到一个内容的,那么这个内容是什么呢?就是通过setType()来进行过滤的。然后 重写Activity的 onActivityResult()方法通过data.getData()得到选中图片的uri,然后可以通过这两种方式获得选中的图片:

1、通过

[java]  view plain copy
print ?
  1. Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);   
来得到bitmap对象。

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

[java]  view plain copy
print ?
  1. // 得到图片路径  
  2.     private String getImgPath(Intent data) {  
  3.         if (data != null) {  
  4.             Uri uri = data.getData();  
  5.             String[] pojo = { MediaStore.Images.Media.DATA };  
  6.             Cursor cursor = this.getContentResolver().query(uri, pojo, null,  
  7.                     nullnull);  
  8.             String path = null;  
  9.             if (cursor != null) {  
  10.                 int columnIndex = cursor.getColumnIndex(pojo[0]);  
  11.                 cursor.moveToFirst(); // 将光标移至开头第一个位置  
  12.                 path = cursor.getString(columnIndex);  
  13.                 cursor.close();  
  14.             }  
  15.             return path;  
  16.         } else {  
  17.             Toast.makeText(UserLogin.this"你没有选择图片", Toast.LENGTH_SHORT)  
  18.                     .show();  
  19.             return null;  
  20.         }  
  21.     }  

  • 怎么把拍照后的图片或者在相册选取的图片先剪切然后再用剪切后的图片呢?通过传一个Uri或者路径,就可以对该图片进行剪切了。

[java]  view plain copy
print ?
  1. // 裁剪图片  
  2.     public void startPhotoZoom(Uri uri) {  
  3.         Intent intent = new Intent("com.android.camera.action.CROP");//发起剪切动作  
  4.         intent.setDataAndType(uri, "image/*");//设置剪切图片的uri和类型  
  5.         intent.putExtra("crop""true");//剪切动作的信号  
  6.         intent.putExtra("aspectX"1);//x和y是否等比缩放  
  7.         intent.putExtra("aspectY"1);  
  8.         intent.putExtra("outputX"320);  
  9.         intent.putExtra("outputY"320);//剪切后图片的尺寸  
  10.         intent.putExtra("return-data"true);//是否把剪切后的图片通过data返回  
  11.         intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());//图片的输出格式    
  12.         intent.putExtra("noFaceDetection"true);  //关闭面部识别  
  13.         //设置剪切的图片保存位置  
  14.         Uri cropUri = Uri.fromFile(new File(  
  15.                 Environment.getExternalStorageDirectory().getPath() + "/zxy/image/crop.png"));  
  16.         intent.putExtra(MediaStore.EXTRA_OUTPUT,cropUri);  
  17.         startActivityForResult(intent, RESULT_REQUEST_CODE);  
  18.     }  

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

Exta Options Table for image/* crop:

附加选项数据类型描述
cropString发送裁剪信号
aspectXintX方向上的比例
aspectYintY方向上的比例
outputXint裁剪区的宽
outputYint裁剪区的高
scaleboolean是否保留比例
return-databoolean是否将数据保留在Bitmap中返回
dataParcelable相应的Bitmap数据
circleCropString圆形裁剪区域?
MediaStore.EXTRA_OUTPUT ("output")URI将URI指向相应的file:///...,详见代码示例
outputFormatString输出格式,一般设为Bitmap格式:Bitmap.CompressFormat.JPEG.toString()
noFaceDetectionboolean是否取消人脸识别功能
这些参数可以随意匹配,这里我们就裁剪从相册转过来的图片,当然也可以单独做一个剪切功能,只需要穿一个uri既可。

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

[java]  view plain copy
print ?
  1. Bundle extras = data.getExtras();  
  2. if (extras != null) {  
  3. Bitmap photo = extras.getParcelable("data");  
  4. Drawable drawable = new BitmapDrawable(null, photo);  
  5. }  
来得到这张图片,这里我们就用这个方法来得到的,较为简便。


【注意】我们在使用剪切图片的时候,通常我们设置属性只能设置一些比较小的值,像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就是指定的保存地址。

这篇关于android拍照获得图片及获得图片后并裁剪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1140590

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk

android应用中res目录说明

Android应用的res目录是一个特殊的项目,该项目里存放了Android应用所用的全部资源,包括图片、字符串、颜色、尺寸、样式等,类似于web开发中的public目录,js、css、image、style。。。。 Android按照约定,将不同的资源放在不同的文件夹中,这样可以方便的让AAPT(即Android Asset Packaging Tool , 在SDK的build-tools目

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

Spring MVC 图片上传

引入需要的包 <dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.1</version></dependency><dependency><groupId>commons-io</groupId><artifactId>commons-

Prompt - 将图片的表格转换成Markdown

Prompt - 将图片的表格转换成Markdown 0. 引言1. 提示词2. 原始版本 0. 引言 最近尝试将图片中的表格转换成Markdown格式,需要不断条件和优化提示词。记录一下调整好的提示词,以后在继续优化迭代。 1. 提示词 英文版本: You are an AI assistant tasked with extracting the content of