美文网首页Android UI相关图片处理
Android图片上传之选择图片裁剪图片

Android图片上传之选择图片裁剪图片

作者: 非常好听的昵称 | 来源:发表于2017-02-26 09:41 被阅读274次
    随笔

    最近在做的一个项目中有用到从图库中选择图片,然后进行裁剪后再使用的功能,在这里也简单的记录下整个实现的过程,以备后查。

    首先来看看布局文件,非常的简单,两个按钮,一个ImageView.

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="match_parent"
                  android:layout_height="match_parent"
                  android:orientation="vertical"
                  android:padding="16dp">
    
        <Button
            android:id="@+id/take_photo_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="拍照"
            android:textSize="16sp"/>
    
        <Button
            android:id="@+id/select_photo_btn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="20dp"
            android:gravity="center"
            android:text="选择图片"
            android:textSize="16sp"/>
    
        <ImageView
            android:id="@+id/photo_iv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="20dp"/>
    </LinearLayout>
    

    然后再来看看代码部分

    package com.example.goblit.selectpic;
    
    import android.app.Activity;
    import android.content.ContentValues;
    import android.content.Intent;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.os.Build;
    import android.os.Bundle;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;
    
    import java.io.File;
    
    public class SelectPicActivity extends Activity implements View.OnClickListener {
        private Button take_photo_btn;
        private Button select_photo_btn;
        private ImageView photo_iv;
        //使用照相机拍照获取图片
        public static final int TAKE_PHOTO_CODE = 1;
        //使用相册中的图片
        public static final int SELECT_PIC_CODE = 2;
        //图片裁剪
        private static final int PHOTO_CROP_CODE = 3;
        //定义图片的Uri
        private Uri photoUri;
        //图片文件路径
        private String picPath;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initViews();
        }
    
        private void initViews() {
            this.take_photo_btn = (Button) findViewById(R.id.take_photo_btn);
            this.take_photo_btn.setOnClickListener(this);
            this.select_photo_btn = (Button) findViewById(R.id.select_photo_btn);
            this.select_photo_btn.setOnClickListener(this);
            this.photo_iv = (ImageView) findViewById(R.id.photo_iv);
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId()) {
                //拍照
                case R.id.take_photo_btn:
                    picTyTakePhoto();
                    break;
                //选择图库
                case R.id.select_photo_btn:
                    pickPhoto();
                    break;
            }
        }
    
        /**
         * 拍照获取图片
         */
        private void picTyTakePhoto() {
            //判断SD卡是否存在
            String SDState = Environment.getExternalStorageState();
            if (SDState.equals(Environment.MEDIA_MOUNTED)) {
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//"android.media.action.IMAGE_CAPTURE"
                /***
                 * 使用照相机拍照,拍照后的图片会存放在相册中。使用这种方式好处就是:获取的图片是拍照后的原图,
                 * 如果不使用ContentValues存放照片路径的话,拍照后获取的图片为缩略图有可能不清晰
                 */
                ContentValues values = new ContentValues();
                photoUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, photoUri);
                startActivityForResult(intent, TAKE_PHOTO_CODE);
            } else {
                Toast.makeText(this, "内存卡不存在", Toast.LENGTH_LONG).show();
            }
        }
    
        /***
         * 从相册中取图片
         */
        private void pickPhoto() {
            Intent intent = new Intent(Intent.ACTION_PICK, null);
            intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
                    "image/*");
            startActivityForResult(intent, SELECT_PIC_CODE);
        }
    
        @Override
        public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            if (resultCode == Activity.RESULT_OK) {
                //从相册取图片,有些手机有异常情况,请注意
                if (requestCode == SELECT_PIC_CODE) {
                    if (null != data && null != data.getData()) {
                        photoUri = data.getData();
                        picPath = uriToFilePath(photoUri);
                        startPhotoZoom(photoUri, PHOTO_CROP_CODE);
                    } else {
                        Toast.makeText(this, "图片选择失败", Toast.LENGTH_LONG).show();
                    }
                } else if (requestCode == TAKE_PHOTO_CODE) {
                    String[] pojo = {MediaStore.Images.Media.DATA};
                    Cursor cursor = managedQuery(photoUri, pojo, null, null, null);
                    if (cursor != null) {
                        int columnIndex = cursor.getColumnIndexOrThrow(pojo[0]);
                        cursor.moveToFirst();
                        picPath = cursor.getString(columnIndex);
                        if (Build.VERSION.SDK_INT < 14) {
                            cursor.close();
                        }
                    }
                    if (picPath != null) {
                        photoUri = Uri.fromFile(new File(picPath));
                        startPhotoZoom(photoUri, PHOTO_CROP_CODE);
                    } else {
                        Toast.makeText(this, "图片选择失败", Toast.LENGTH_LONG).show();
                    }
                } else if (requestCode == PHOTO_CROP_CODE) {
                    if (photoUri != null) {
                        Bitmap bitmap = BitmapFactory.decodeFile(picPath);
                        if (bitmap != null) {
                            //这里可以把图片进行上传到服务器操作
                            photo_iv.setImageBitmap(bitmap);
                        }
                    }
                }
            }
        }
    
        private void startPhotoZoom(Uri uri, int REQUE_CODE_CROP) {
            Intent intent = new Intent("com.android.camera.action.CROP");
            intent.setDataAndType(uri, "image/*");
            // crop=true是设置在开启的Intent中设置显示的VIEW可裁剪
            intent.putExtra("crop", "true");
            // 去黑边
            intent.putExtra("scale", true);
            intent.putExtra("scaleUpIfNeeded", true);
            // aspectX aspectY 是宽高的比例,根据自己情况修改
            intent.putExtra("aspectX", 1);
            intent.putExtra("aspectY", 1);
            // outputX outputY 是裁剪图片宽高像素
            intent.putExtra("outputX", 100);
            intent.putExtra("outputY", 100);
            intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
            //取消人脸识别功能
            intent.putExtra("noFaceDetection", true);
            //设置返回的uri
            intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
            //设置为不返回数据
            intent.putExtra("return-data", false);
            startActivityForResult(intent, REQUE_CODE_CROP);
        }
    
        private String uriToFilePath(Uri uri) {
            //获取图片数据
            String[] proj = {MediaStore.Images.Media.DATA};
            //查询
            Cursor cursor = managedQuery(uri, proj, null, null, null);
            //获得用户选择的图片的索引值
            int image_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            //返回图片路径
            return cursor.getString(image_index);
        }
    }
    

    整个选择图片并且裁剪的demo就写好了,其实是非常的简单。

    相关文章

      网友评论

      本文标题:Android图片上传之选择图片裁剪图片

      本文链接:https://www.haomeiwen.com/subject/gfkowttx.html