更换背景——从相册或相机中获取图片并截取
来源:互联网 发布:按键精灵 数组直接赋值 编辑:程序博客网 时间:2024/06/05 13:30
参考 http://blog.csdn.net/floodingfire/article/details/8144587
关键在于裁剪的调用及返回:
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:///...,详见代码示例现在,最令人困惑的是MediaStore.EXTRA_OUTPUT以及return-data选项。
你主要有两种方式从这个Intent中取得返回的bitmap:获取内部数据或者提供一个Uri以便程序可以将数据写入。
方法1:如果你将return-data设置为“true”,你将会获得一个与内部数据关联的Action,并且bitmap以此方式返回:(Bitmap)extras.getParcelable("data")。注意:如果你最终要获取的图片非常大,那么此方法会给你带来麻烦,所以你要控制outputX和outputY保持在较小的尺寸。鉴于此原因,在我的代码中没有使用此方法((Bitmap)extras.getParcelable("data"))。
下面是CropImage.java的源码片段:
1
// Return the cropped image directly or save it to the specified URI.
2
Bundle myExtras = getIntent().getExtras();
3
if
(myExtras !=
null
&& (myExtras.getParcelable(
"data"
) !=
null
|| myExtras.getBoolean(
"return-data"
)))
4
{
5
Bundle extras =
new
Bundle();
6
extras.putParcelable(
"data"
, croppedImage);
7
setResult(RESULT_OK,(
new
Intent()).setAction(
"inline-data"
).putExtras(extras));
8
finish();
9
}
但是还有一些条件,首先你需要有一个短暂的与此Uri相关联的文件地址,当然这不是个大问题(除非是那些没有sdcard的设备)。
下面是CropImage.java关于操作Uri的源码片段:
01
if
(mSaveUri !=
null
) {
02
OutputStream outputStream =
null
;
03
try
{
04
outputStream = mContentResolver.openOutputStream(mSaveUri);
05
if
(outputStream !=
null
) {
06
croppedImage.compress(mOutputFormat,
75
, outputStream);
07
}
08
}
catch
(IOException ex) {
09
// TODO: report error to caller
10
Log.e(TAG,
"Cannot open file: "
+ mSaveUri, ex);
11
}
finally
{
12
Util.closeSilently(outputStream);
13
}
14
Bundle extras =
new
Bundle();
15
setResult(RESULT_OK,
new
Intent(mSaveUri.toString()).putExtras(extras));
16
}
<pre name="code" class="java">private static final int REQUEST_CHANGE_FROM_CAMERA_MASK = 0x10;//拍照修改private static final int REQUEST_CHANGE_FROM_ALBUM_MASK = 0x20;//从相册中获取图片修改private static final int FLAG_LITTLE = 0x1;//小图方式private static final int FLAG_BIG = 0x2;//小图方式/** * 从相册中获取图片 * @param requestCode */private void getFromAlbum(int requestCode) {Intent intent = new Intent(Intent.ACTION_GET_CONTENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");startActivityForResult(intent, requestCode);}/** * 拍照获取图片 * @param requestCode */private void getFromCamera(int requestCode) {Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//tmpFileName = System.currentTimeMillis()+".jpg";intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getExternalCacheDir(), "sample.jpg")));//拍照完自动保存到外置sd卡的缓存目录中startActivityForResult(intent, requestCode);}private void startCropPhoto(Uri uri, int requestCode) {Intent intent = new Intent("com.android.camera.action.CROP");intent.setDataAndType(uri, "image/*"); intent.putExtra("crop", "true");intent.putExtra("aspectX", 1);//宽高比1:1intent.putExtra("aspectY", 1);intent.putExtra("scale", true);intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());intent.putExtra("noFaceDetection", true);if(requestCode == FLAG_LITTLE){//小图片 intent.putExtra("outputX", 100);//截取尺寸大小 intent.putExtra("outputY", 100); intent.putExtra("return-data", true);//返回Bitmap}else if(requestCode == FLAG_BIG){//大图片intent.putExtra("outputX", 400); intent.putExtra("outputY", 400);intent.putExtra("return-data", false);//不返回,直接保存为文件intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(getExternalFilesDir(null), "sample.jpg")));}else{return;} startActivityForResult(intent, requestCode);}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if(resultCode == RESULT_OK){switch(requestCode){//来自相册回调case FLAG_LITTLE + REQUEST_CHANGE_FROM_ALBUM_MASK:case FLAG_BIG + REQUEST_CHANGE_FROM_ALBUM_MASK:Uri uri = data.getData();startCropPhoto(uri, requestCode - REQUEST_CHANGE_FROM_ALBUM_MASK);break;//来自相机回调case FLAG_LITTLE + REQUEST_CHANGE_FROM_CAMERA_MASK:case FLAG_BIG + REQUEST_CHANGE_FROM_CAMERA_MASK:startCropPhoto(Uri.fromFile(new File(getExternalCacheDir(), "sample.jpg")),requestCode - REQUEST_CHANGE_FROM_CAMERA_MASK);break;case FLAG_LITTLE:Bitmap photo = data.getExtras().getParcelable("data");//截图后返回的是小图BitmapsaveImage(photo, "sample.jpg");//保存图片loadImage("sample.jpg");//载入新图片break;case FLAG_BIG ://截图后返回(图片在截取后已经自动保存到文件中了)loadImage("sample.jpg");break;}}}private void saveImage(Bitmap photo, String pic_name){try {//保存图像到外置SD卡中FileOutputStream bgOutput = new FileOutputStream(new File(getExternalFilesDir(null), pic_name));photo.compress(Bitmap.CompressFormat.JPEG, 100, bgOutput);bgOutput.flush();bgOutput.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}private boolean loadImage(String pic_name) {try {FileInputStream openFileInput = new FileInputStream(new File(getExternalFilesDir(null), pic_name));imageView.setBackgroundDrawable(new BitmapDrawable(getResources(), BitmapFactory.decodeStream(openFileInput)));//imageView.setImageBitmap(BitmapFactory.decodeStream(openFileInput));openFileInput.close();return true;} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return false;}调用://从相册中获取小图getFromAlbum(REQUEST_CHANGE_FROM_ALBUM_MASK + FLAG_LITTLE);//从相册中获取大图getFromAlbum(REQUEST_CHANGE_FROM_ALBUM_MASK + FLAG_BIG);//拍照获取小图(拍出来的照片一般都是大图)//getFromCamera(REQUEST_CHANGE_FROM_CAMERA_MASK + FLAG_LITTLE);//拍照获取大图getFromCamera(REQUEST_CHANGE_FROM_CAMERA_MASK + FLAG_BIG);
文件下载:http://download.csdn.net/detail/langrenfengzi/7864693
0 0
- 更换背景——从相册或相机中获取图片并截取
- iOS 从相机或相册获取图片并裁剪
- iOS 从相机或相册获取图片并裁剪
- iOS 从相机或相册获取图片并裁剪
- Android 从相机或相册获取图片并裁剪
- Android 从相机或相册获取图片并剪切
- 从相机、相册获取照片或图片
- [IOS]从相册或相机获取图片
- Android 从相机或相册获取图片
- 从相机相册获取图片裁剪后用于评论晒图或更换背景图
- iOS从相机或相册获取图片并裁剪,再获取裁剪后的图片
- android中跳转相册,相机获取图片后截取图片并保存SDCARD
- Android 代码片段---从相册或相机获取图片保存并处理
- iOS开发 使用UIImagePicker从相机或相册获取图片并裁剪
- Android中使用OKHttp上传图片,从相机和相册中获取图片并剪切
- Android选择图片(从相册或相机)并裁剪
- Android从相机或相册获取图片裁剪
- [IOS]iphone从相册或相机获取图片
- caoliu,caoliushequ,cl社区,1024论坛,1024cl社区最新地址
- 堆和栈:C++中系统内存分区与程序内存分区
- ubuntu创建、删除文件及文件夹,强制清空回收站方法
- chapter7 机器学习之元算法(adaboost)提高分类性能从原理到实现
- 让python的mysqldb返回的结果集为字典类型
- 更换背景——从相册或相机中获取图片并截取
- AlphabetIndexer字母索引辅助类
- 随机化算法——随机数类代码
- 夏时制
- C++中系统内存分区与程序内存分区
- error: no matching function for call to 'std::basic_ifstream<char>::open(std::string&)
- java中的io系统详解(值得一看)
- 告诉你掌握哪些才算掌握了Java基础
- 之前工作真机调试的奇遇