从相机和图库获取图片并裁剪
由于数据装换时用到了外部存储,要添加外部数据读写的权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
调用启动相机:
//调用系统图库
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//新建一个内容选择界面的Intent
intent.setType("image/*");//设置Intent选择的文件类型
startActivityForResult(intent, GALLERY_REQUEST_CODE);
调用图库:
//调用系统图库
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//新建一个内容选择界面的Intent
intent.setType("image/*");//设置Intent选择的文件类型
startActivityForResult(intent, GALLERY_REQUEST_CODE);
调用图像裁剪界面:
Intent intent = new Intent("com.android.camera.action.CROP");//建立图像裁剪页面的Intent
intent.setDataAndType(uri, "image/*");//设置数据和类型
intent.putExtra("crop", true);//设置开启的Intent中显示的View为可裁剪的
intent.putExtra("aspectX", 1);//裁剪的宽高比例,这里设为1:1
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);//裁剪的宽和高,也是我们得到的最终输出图片的宽和高
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);//设置裁剪后的图片是通过Intent返回回来的
startActivityForResult(intent, CROP_REQUEST_CODE);
完整代码:
MainActivity.java
package com.duduhali.avatar;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.MediaStore.Audio.Media;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
final int CAMERA_REQUEST_CODE = 1;//拍照功能请求码
final int GALLERY_REQUEST_CODE = 2;//图库请求码
final int CROP_REQUEST_CODE = 3;//图像裁剪请求码
Button bt_camera,bt_gallery;
ImageView iv_avater;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt_camera = (Button)findViewById(R.id.button1);
bt_gallery = (Button)findViewById(R.id.button2);
iv_avater = (ImageView)findViewById(R.id.imageView1);
bt_camera.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//调用系统的拍照功能
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(intent, CAMERA_REQUEST_CODE);
}
});
bt_gallery.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
//调用系统图库
Intent intent = new Intent(Intent.ACTION_GET_CONTENT);//新建一个内容选择界面的Intent
intent.setType("image/*");//设置Intent选择的文件类型
startActivityForResult(intent, GALLERY_REQUEST_CODE);
}
});
}
//图片保存在本地,并file类型的Uri,需添加外部存储的读写权限
private Uri saveBitmap( Bitmap bm ){
File tmpDir = new File(Environment.getExternalStorageDirectory()+"/com.duduhali.avater");
if( !tmpDir.exists() ){
tmpDir.mkdir();//建立一个可用的临时文件夹目录
}
File img = new File(tmpDir.getAbsolutePath()+"duduhali.png");//建立临时文件
try {
FileOutputStream fos = new FileOutputStream(img);
bm.compress(Bitmap.CompressFormat.PNG, 85, fos);//三个参数分别是:压缩格式(建立的文件类型对应),图片质量,写入的输出流
fos.flush();
fos.close();
return Uri.fromFile(img);//产生一个file类型的Uri返回
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//content类型Uri转化为file类型的Uri
private Uri convertUri( Uri uri ){
InputStream is = null;
try {
is = getContentResolver().openInputStream(uri);
Bitmap bitmap = BitmapFactory.decodeStream(is);//从InputStream生产Bitmap数据类型
is.close();
return saveBitmap(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
//启动图像裁剪页面
private void startImageZoom(Uri uri){
Intent intent = new Intent("com.android.camera.action.CROP");//建立图像裁剪页面的Intent
intent.setDataAndType(uri, "image/*");//设置数据和类型
intent.putExtra("crop", true);//设置开启的Intent中显示的View为可裁剪的
intent.putExtra("aspectX", 1);//裁剪的宽高比例,这里设为1:1
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", 150);//裁剪的宽和高,也是我们得到的最终输出图片的宽和高
intent.putExtra("outputY", 150);
intent.putExtra("return-data", true);//设置裁剪后的图片是通过Intent返回回来的
startActivityForResult(intent, CROP_REQUEST_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
if( requestCode == CAMERA_REQUEST_CODE ){//从相机返回
if(data == null){//判断用户点击是否是取消
return;
}else{
Bundle extras = data.getExtras();
if( extras != null ){
Bitmap bm = extras.getParcelable("data");//获取相机返回的图片
Uri uri = saveBitmap(bm);
startImageZoom(uri);//启动图片裁剪界面
}
}
}else if( requestCode == GALLERY_REQUEST_CODE ){//从图库返回
if( data == null ){//判断用户点击是否是取消
return;
}else{
Uri uri = data.getData();//返回的是content类型的Uri,congtent的类型的Uri不能直接进行复制等操作
Uri fileUri = convertUri(uri);//转化为
startImageZoom(fileUri);//启动图片裁剪界面
}
}else if( requestCode == CROP_REQUEST_CODE ){
if( data == null ){//判断用户点击是否是取消
return;
}else{
Bundle extras = data.getExtras();
if( extras == null ){
return;
}else{
Bitmap bm = extras.getParcelable("data");//获取图像裁剪界面返回的图片
iv_avater.setImageBitmap(bm);//显示图片
}
}
}
}
}
activity_main.xml
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.duduhali.avatar.MainActivity" >
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="从相机获取" />
<Button
android:id="@+id/button2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/button1"
android:text="从图库获取" />
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/button2"
android:layout_centerHorizontal="true"
/>
</RelativeLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.duduhali.avatar"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>