Android上从相册选择后剪裁图片

本文介绍了如何在Android应用中实现从相册选择图片并进行剪裁的步骤,包括打开系统相册获取图片、启动剪裁Activity以及处理剪裁后的图片,提供了关键的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android上从相册选择后剪裁图片

现在带用户功能的APP基本都要做一个带头像剪裁上传的功能,主要步骤如下:

  • 1.打开系统相册
  • 2.选择好图片,通过onActivityResult获得图片
  • 3.打开剪裁activity,把选择好的照片传进去
  • 4.处理剪裁好的图片

1.打开系统相册
     /**
       *CODE_GALLERY_REQUEST 请求识别码 
       */
    private static final int CODE_GALLERY_REQUEST = 0xa0;

    public void openGallery() {
        Intent pickIntent;

        if (android.os.Build.VERSION.SDK_INT >= 19) { 
        // 判断是不是4.4系统,不同的系统用了不同的action
            pickIntent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
        } else {
            pickIntent = new Intent(Intent.ACTION_GET_CONTENT);
        }
        // 如果要限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型"
        pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
        startActivityForResult(pickIntent, CODE_GALLERY_REQUEST);

    }
2.获得选好的图片

这个时候我们应该就选好图片了,去onActivityResult里拿到图片

@Override  
public void onActivityResult(int requestCode, int resultCode, Intent data) {  

    switch (requestCode) {  
    case CODE_GALLERY_REQUEST:// 直接从相册获取的图片 
        try {  
            cropRawPhoto(data.getData());  
        } catch (NullPointerException e) {  
            e.printStackTrace();// 用户点击取消操作  
        }  
        break;  
   }
    super.onActivityResult(requestCode, resultCode, data);  
}  
3.打开剪裁activity
    private static final int CODE_CROP_REQUEST = 0xa2;
    private static int output_X = 480;
    private static int output_Y = 480;
    private Uri templeUri;
    private String path, userName="joeys";
    public void cropRawPhoto(Uri uri) {

        Intent intent = new Intent("com.android.camera.action.CROP");
        //将选好的图片传进去
        intent.setDataAndType(uri, "image/*");

        // 设置裁剪
        intent.putExtra("crop", "true");

        // aspectX , aspectY :宽高的比例
        intent.putExtra("aspectX", 1);
        intent.putExtra("aspectY", 1);

        // outputX , outputY : 裁剪图片宽高
        intent.putExtra("outputX", output_X);
        intent.putExtra("outputY", output_Y);

        //创建一个新的文件,用来存放我们的剪裁好的图片
        path = createAvatarPath(userName);

        //将刚才创建好的文件路径转化为uri。ps(这样做的好处大大的有,因为别的方法你会坑爹的发现在小米手机上用不了,剪裁后就崩溃或者activity直接关闭,得不到我们剪裁好的图片,但是这样就不会了)
        templeUri = Uri.parse("file://" + path);

         //让系统将剪裁好的图片存入我们创建的文件
        intent.putExtra(MediaStore.EXTRA_OUTPUT, templeUri);

         //将剪裁好的图片输出格式设为png,和我们之前创建的文件的后缀名一致  
        intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());


        startActivityForResult(intent, CODE_CROP_REQUEST);
    }

创建头像的文件的方法:

   public static final String AVATAR_DIR = "sdcard/avatar/";
   public static String createAvatarPath(String userName) {
        String dir = AVATAR_DIR;
        File destDir = new File(dir);
        if (!destDir.exists()) {
        //如果这个文件夹不存在,就创建一个
            destDir.mkdirs();
        }
        File file;
        if (userName != null) {
        //这里注意一下,如果我们创建的文件重名,新的文件就会覆盖掉原来的文件
            file = new File(dir, userName + ".png");
        } else {
            file = new File(dir, new DateFormat().format("yyyy_MMdd_hhmmss",
                    Calendar.getInstance(Locale.CHINA)) + ".png");
        }
        return file.getAbsolutePath();
    }
4.处理裁好的图片

这就简单了,我们在onActivityResult里,通过templeUri拿到bitmap,另外图片的path我们也知道,然后要杀要剐随你便。。

 if (requestCode == CODE_CROP_REQUEST) {

            try {

                Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(templeUri));

                imageview.setImageBitmap(bitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }


        }

至此我们的图片选择与剪裁大功告成,enjoy~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值