您的位置:首页 > 移动开发 > Android开发

Android从相机、相册选择图片并裁剪

2014-11-20 20:04 459 查看
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_S***E = 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_S***E, 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,调用相机是设置图片输出路径,然后直接从设置的路径里提取数据

效果图:







内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: