Android 相机拍照和本地图片裁剪

一.选择本地图片进行裁剪编辑

    1.使用意图Intent.action.PICK (媒体库列表,选择某项并返回所选数据)

    (intent.action.GET_CONTENT 打开的是文件系统(包括视频、音频、图片等)供用户选择数据,并返回所选数据)


Intent mIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(mIntent,ROAD_PICTURE);
第二个参数是为了筛选出媒体库里的图片资源文件,

2.通过onActivityResult()方法中返回的data获取选中图片的uri

调用下面方法进行图片的裁剪

private String startPhotoZoom(Uri uri) {
        try {
            Log.e("====", "uri = " + uri);

            SimpleDateFormat sDateFormat = new SimpleDateFormat(
                    "yyyyMMddhhmmss");
            String address = sDateFormat.format(new java.util.Date());
            if (!FileUtils.isFileExist("")) {
                FileUtils.createSDDir("");

            }
            imageUrl = FileUtils.SDPATH + address + ".JPEG";
            Log.e(TAG,"imageUrl ="+imageUrl);
            //1.Uri获得文件路径
            Uri imageUri = Uri.fromFile(new File(imageUrl));

            //调用以下代码会跳转到Android系统自带的一个图片剪裁页面,点击确定之后就会得到一张图片
            final Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setDataAndType(uri, "image/*");
            intent.putExtra("crop", "true"); //cropString 发送裁剪信号
            intent.putExtra("aspectX", 1);     //aspectXintX 方向上的比例
            intent.putExtra("aspectY", 1);  // aspectYintY 方向上的比例
            intent.putExtra("outputX", 480);//outputXint  裁剪区的宽
            intent.putExtra("outputY", 480); //outputYint 裁剪区的高
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
            intent.putExtra("outputFormat",
                    Bitmap.CompressFormat.JPEG.toString());
            intent.putExtra("noFaceDetection", false);
            intent.putExtra("return-data", false);
            startActivityForResult(intent, CUT_PHOTO_REQUEST_CODE);
            return address;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}
3.进入系统调用的裁剪界面点确定按键后,可以根据配置生成图片文件

即调用下面代码

if (resultCode == RESULT_OK && null != data) {
    Bitmap bitmap = ImageCacheUtil.getLoacalBitmap(imageUrl);
    System.out.println("bitmap = " + bitmap);
    FileUtils.deleteDir(FileUtils.SDPATH);
    uploadBitmap = ImageCacheUtil.createFramedPhoto(480, 480,
            bitmap, (int) (dp * 1.6f)); //480*480 是保存图片的分辨率
    FileUtils.saveBitmap(uploadBitmap, picName);
    File file = new File(FileUtils.SDPATH, picName + ".JPEG");

    //获取到这个file 文件后进行网络上传等操作,这里只是显示界面上!
    if(file ==null){
        Log.e(TAG,"file == null");}
    else if(file != null)
    {
        Log.e(TAG,"file != null");
        //show_cot_imv.setBackgroundResource(R.mipmap.ic_launcher);
        //ImageCacheUtil.toRoundBitmap();进行圆角化处理
 show_cot_imv.setImageBitmap(ImageCacheUtil.toRoundBitmap(uploadBitmap));
        Log.e(TAG,"filedir ="+FileUtils.SDPATH+picName+".JPEG");
        /*String fileName =FileUtils.SDPATH+picName+".JPEG" ;
        Bitmap bm = BitmapFactory.decodeFile(fileName);
        show_cot_imv.setImageBitmap(bm);*/
    }

}
4.最后得到保存在
FileUtils.SDPATH+picName+".JPEG"路劲下的裁剪图片。

二.通过拍照获取图片进行裁剪

1.使用 MediaStore.ACTION_IMAGE_CAPTURE 启动安装在手机上的摄像头应用程序

直接看代码

try {
    Intent openCameraIntent = new Intent(
            MediaStore.ACTION_IMAGE_CAPTURE);

    String sdcardState = Environment.getExternalStorageState();
    String sdcardPathDir = android.os.Environment
            .getExternalStorageDirectory().getPath() + "/tempImage/";
    File file = null;
    if (Environment.MEDIA_MOUNTED.equals(sdcardState)) {
        // ��sd�����Ƿ���myImageļ���
        File fileDir = new File(sdcardPathDir);
        if (!fileDir.exists()) {
            fileDir.mkdirs();
        }
        // Ƿ���headImgļ        file = new File(sdcardPathDir + System.currentTimeMillis()
                + ".JPEG");
    }
    if (file != null) {
        path = file.getPath();
        photoUri = Uri.fromFile(file);
        Log.e("=====", "��ȡ����ͼƬ��ַ ��" + photoUri);
        openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri);

        startActivityForResult(openCameraIntent, TAKE_PICTURE);
    }

} catch (Exception e) {
    e.printStackTrace();
}
点确定后,onActivityResult()中把photoUri 传递给startPhotoZoom();

接下来的裁剪过程与选择本地图片后的裁剪过程是一致的,这里不再赘述。

下面附上下载链接,点击下载!










你可能感兴趣的:(Android 相机拍照和本地图片裁剪)