Android从相机、相册选择图片并裁剪
package com.example.imagescale;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class ImageScaleActivity extends Activity implements OnClickListener{
private String TAG = "ImageScaleActivity";
public static final String IMAGE_SAVE = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM) + "/Camera";
public final static int REQ_CODE_GALLERY = 201;
public final static int REQ_CODE_CAMERA = 203;
public final static int REQ_CODE_PHOTO_CROP = 102;
private Button mSelectBtn;
private Button mScaleBtn;
private ImageView mImageView;
public Uri mCameraImageUri;
public Uri mImageUri;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image_scale);
Log.d(TAG, "onCreate");
Display display = getWindowManager().getDefaultDisplay();
int width = display.getWidth();
int height = display.getHeight();
Log.d(TAG, "width = " + width + "-- height = " + height);
double scale = getResources().getDisplayMetrics().density;
Log.d(TAG, "scale = " + scale);
initViews();
}
private void initViews(){
mImageView = (ImageView)findViewById(R.id.jimageview);
mSelectBtn = (Button)findViewById(R.id.selectpic);
mScaleBtn = (Button)findViewById(R.id.scalepic);
mSelectBtn.setOnClickListener(this);
mScaleBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.selectpic:
showPostMenu();
break;
case R.id.scalepic:
if(mImageUri != null){
cropImage(mImageUri, 500, 500, REQ_CODE_PHOTO_CROP);
}
break;
default:
break;
}
}
private void showPostMenu()
{
new AlertDialog.Builder(this).setItems(new String[] { "拍照", "相册" }, new DialogInterface.OnClickListener()
{
public void onClick(DialogInterface paramDialogInterface, int paramInt)
{
if (paramInt == 0){
Intent localIntent1 = new Intent("android.media.action.IMAGE_CAPTURE");
//设置相机图片的输出路径
mCameraImageUri = Uri.fromFile(new File(IMAGE_SAVE, new SimpleDateFormat("yyyyMMdd-HHmmss").format(new Date()) + ".jpg"));
localIntent1.putExtra("output", mCameraImageUri);
Log.d(TAG, "mCameraImageUri:" + mCameraImageUri);
ImageScaleActivity.this.startActivityForResult(localIntent1, REQ_CODE_CAMERA);
return;
} else {
Intent localIntent2 = new Intent();
localIntent2.setType("image/*");
localIntent2.setAction("android.intent.action.GET_CONTENT");
ImageScaleActivity.this.startActivityForResult(Intent.createChooser(localIntent2, "选择照片"), REQ_CODE_GALLERY);
}
}
}).show();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO Auto-generated method stub
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "onActivityResult");
if(resultCode == RESULT_OK){
if (requestCode == REQ_CODE_GALLERY) {
// 从相册返回
Uri localUri = data.getData();
if (localUri == null){
return;
}
Bitmap localBitmap = BitmapLoader.decodeSampledBitmapFromUri(getContentResolver(), localUri, 100, 100);
if (localBitmap != null)
{
if (localBitmap.getHeight() != localBitmap.getWidth())
{
Log.d(TAG, "localUri:" + localUri);
mImageUri = localUri;
mImageView.setImageURI(localUri);
// cropImage(localUri, 500, 500, REQ_CODE_PHOTO_CROP);
}
}
} else if (requestCode == REQ_CODE_CAMERA){
// 从相机返回,从设置相机图片的输出路径中提取数据
Log.d(TAG, "mCameraImageUri:" + mCameraImageUri);
mImageView.setImageURI(mCameraImageUri);
mImageUri = mCameraImageUri;
//cropImage(mImageUri, 500, 500, REQ_CODE_PHOTO_CROP);
} else if (requestCode == REQ_CODE_PHOTO_CROP) {
// 从剪切图片返回的数据
if (data != null) {
Bitmap bitmap = data.getParcelableExtra("data");
mImageView.setImageBitmap(bitmap);
}
}
}
}
//调用系统的裁剪图片功能
public void cropImage(Uri uri, int outputX, int outputY, int requestCode){
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
// crop为true是设置在开启的intent中设置显示的view可以剪裁
intent.putExtra("crop", "true");
//裁剪框比例
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
//图片输出大小
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("outputFormat", "JPEG");
intent.putExtra("noFaceDetection", true);
intent.putExtra("return-data", true);
startActivityForResult(intent, requestCode);
}
}
调用相册直接返回的是Uri,调用相机是设置图片输出路径,然后直接从设置的路径里提取数据
效果图: