首页 > 代码库 > 拍照/从相册读取图片后进行裁剪的方法

拍照/从相册读取图片后进行裁剪的方法

本范例实现的是用户可以通过拍照、相册获取图片,然后进行裁剪,最后将结果保存在IamgeView中。当然你可以选择将结果同时存放在sd卡中,作为以后的缓存。

思路:

1.通过拍照获取图片

进入系统自带的相机界面——>拍照——>保存在sd卡中——>读取sd卡的文件进行裁减。PS:裁剪前先判断是否获取到图片了

2.通过系统相册获取图片

进入系统相册——>找到图片——>进行裁减。PS:裁剪前线判断是否获取到系统的图片了

 

接下来贴上实现方法:

1.进入拍照界面或者相册的方法,获取信息后回调onActivityResult()方法

public void buttonListener(View v) {        switch (v.getId()) {        case R.id.fromAlbum_button:            // 来自相册            Intent albumIntent = new Intent(Intent.ACTION_PICK, null);            /**             * 下面这句话,与其它方式写是一样的效果,如果:             * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);             * intent.setType(""image/*");设置数据类型             * 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"             */            albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");            startActivityForResult(albumIntent, ALBUM_OK);            break;        case R.id.fromCamera_button:            // 来自相机            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            // 下面这句指定调用相机拍照后的照片存储的路径            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));            startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判断返回结果的标识            break;        default:            break;        }    }

 

2.得到信息,交给onActivityResult()处理。先判断是否得到信息,如果得到就进行裁剪

@Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        System.out.println("requestCode = " + requestCode);        switch (requestCode) {        // 如果是直接从相册获取        case ALBUM_OK:            //从相册中获取到图片了,才执行裁剪动作            if (data != null) {                clipPhoto(data.getData());            }            break;        // 如果是调用相机拍照时        case CAMERA_OK:            // 当拍照到照片时进行裁减,否则不执行操作            if (file.exists()) {                clipPhoto(Uri.fromFile(file));//开始裁减图片            }            break;        // 取得裁剪后的图片,这里将其设置到imageview中        case CUT_OK:            /**             * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,             * 要重新裁剪,丢弃 当前功能时,会报NullException             */            if (data != null) {                setPicToView(data);            }            break;        default:            break;        }        super.onActivityResult(requestCode, resultCode, data);    }

 

3.进行图片裁剪的方法:

/**     * 裁剪图片方法实现     * @param uri     */    public void clipPhoto(Uri uri) {        Intent intent = new Intent("com.android.camera.action.CROP");        intent.setDataAndType(uri, "image/*");        // 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪        intent.putExtra("crop", "true");        // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)        intent.putExtra("aspectX", 1);        intent.putExtra("aspectY", 1);        // outputX outputY 是裁剪图片宽高        intent.putExtra("outputX", 200);        intent.putExtra("outputY", 200);        intent.putExtra("return-data", true);        startActivityForResult(intent, CUT_OK);    }

 

4.将裁剪好的图片设置到ImageView中,同时清楚缓存图片

/**     * 保存裁剪之后的图片数据 将图片设置到imageview中     *      * @param picdata     */    private void setPicToView(Intent picdata) {        Bundle extras = picdata.getExtras();        if (extras != null) {            Bitmap photo = extras.getParcelable("data");            Drawable drawable = new BitmapDrawable(photo);            showIv.setImageDrawable(drawable);            file.delete();//设置成功后清除之前的照片文件        }    }

 

最后贴上全部的代码:

package com.kale.picturecut;import java.io.File;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.net.Uri;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import android.view.View;import android.widget.ImageView;public class MainActivity extends Activity {    // 拍照成功,读取相册成功,裁减成功    private final int  ALBUM_OK = 1, CAMERA_OK = 2,CUT_OK = 3;    private ImageView showIv;    private File file;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        // 定义拍照后存放图片的文件位置和名称,使用完毕后可以方便删除        file = new File(Environment.getExternalStorageDirectory(), "temp.jpg");        file.delete();// 清空之前的文件        showIv = (ImageView) findViewById(R.id.show_imageView);    }    public void buttonListener(View v) {        switch (v.getId()) {        case R.id.fromAlbum_button:            // 来自相册            Intent albumIntent = new Intent(Intent.ACTION_PICK, null);            /**             * 下面这句话,与其它方式写是一样的效果,如果:             * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);             * intent.setType(""image/*");设置数据类型             * 要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"             */            albumIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");            startActivityForResult(albumIntent, ALBUM_OK);            break;        case R.id.fromCamera_button:            // 来自相机            Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);            // 下面这句指定调用相机拍照后的照片存储的路径            cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));            startActivityForResult(cameraIntent, CAMERA_OK);// CAMERA_OK是用作判断返回结果的标识            break;        default:            break;        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        System.out.println("requestCode = " + requestCode);        switch (requestCode) {        // 如果是直接从相册获取        case ALBUM_OK:            //从相册中获取到图片了,才执行裁剪动作            if (data != null) {                clipPhoto(data.getData());            }            break;        // 如果是调用相机拍照时        case CAMERA_OK:            // 当拍照到照片时进行裁减,否则不执行操作            if (file.exists()) {                clipPhoto(Uri.fromFile(file));//开始裁减图片            }            break;        // 取得裁剪后的图片,这里将其设置到imageview中        case CUT_OK:            /**             * 非空判断大家一定要验证,如果不验证的话, 在剪裁之后如果发现不满意,             * 要重新裁剪,丢弃 当前功能时,会报NullException             */            if (data != null) {                setPicToView(data);            }            break;        default:            break;        }        super.onActivityResult(requestCode, resultCode, data);    }    /**     * 裁剪图片方法实现     * @param uri     */    public void clipPhoto(Uri uri) {        Intent intent = new Intent("com.android.camera.action.CROP");        intent.setDataAndType(uri, "image/*");        // 下面这个crop = true是设置在开启的Intent中设置显示的VIEW可裁剪        intent.putExtra("crop", "true");        // aspectX aspectY 是宽高的比例,这里设置的是正方形(长宽比为1:1)        intent.putExtra("aspectX", 1);        intent.putExtra("aspectY", 1);        // outputX outputY 是裁剪图片宽高        intent.putExtra("outputX", 200);        intent.putExtra("outputY", 200);        intent.putExtra("return-data", true);        startActivityForResult(intent, CUT_OK);    }    /**     * 保存裁剪之后的图片数据 将图片设置到imageview中     *      * @param picdata     */    private void setPicToView(Intent picdata) {        Bundle extras = picdata.getExtras();        if (extras != null) {            Bitmap photo = extras.getParcelable("data");            Drawable drawable = new BitmapDrawable(photo);            showIv.setImageDrawable(drawable);            file.delete();//设置成功后清除之前的照片文件        }    }}

 

权限:

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    <uses-permission android:name="android.per

 

源码下载:

 

拍照/从相册读取图片后进行裁剪的方法