Android 按照比例剪裁图片,以及拍照并剪裁

产片又提要求了,上传证件照的时候,要按照比例来剪裁,以前切头像,都是1:1 或者是圆形的,
现在我把这个功能共享给同学们
以下是关键代码

public class HeadImageFragment extends Fragment implements View.OnClickListener {

private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";

private String mParam1;
private String mParam2;

private OnFragmentInteractionListener mListener;
public static final int PHOTO_REQUEST_GALLERY = 100;
public static final int PHOTO_REQUEST_CAREMA = 200;
public static final int PHOTO_REQUEST_RESULT = 300;
private static final String IMAGE_FILE_NAME = "faceImage.jpg";
private Button localBtn, cameraBtn;
private ImageView imgv;

private Uri localUri;

public static HeadImageFragment newInstance(String param1, String param2) {
    HeadImageFragment fragment = new HeadImageFragment();
    Bundle args = new Bundle();
    args.putString(ARG_PARAM1, param1);
    args.putString(ARG_PARAM2, param2);
    fragment.setArguments(args);
    return fragment;
}

public HeadImageFragment() {    }

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        mParam1 = getArguments().getString(ARG_PARAM1);
        mParam2 = getArguments().getString(ARG_PARAM2);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_head_image, container, false);
    init(view);
    localBtn.setOnClickListener(this);
    cameraBtn.setOnClickListener(this);
    return view;
}

/**
 * 实例化
 *
 * @param view
 */
private void init(View view) {
    localBtn = ((Button) view.findViewById(R.id.local_btn));
    cameraBtn = ((Button) view.findViewById(R.id.camera_btn));
    imgv = ((ImageView) view.findViewById(R.id.imgv));
}

/**
 * 从相册获取
 */
public void gallery() {
    //激活系统图库,选取一张图片
    Intent intent = new Intent(Intent.ACTION_PICK);
    intent.setType("image/*");
    startActivityForResult(intent, PHOTO_REQUEST_GALLERY);
}

/**
 * 从相机获取
 */
public void camera() {
    //激活相机
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (SDCardHelper.getSDCardState()) {
        intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME)));
    }
    startActivityForResult(intent, PHOTO_REQUEST_CAREMA);
}

// TODO: Rename method, update argument and hook method into UI event
public void onButtonPressed(Uri uri) {
    if (mListener != null) {
        mListener.onFragmentInteraction(uri);
    }
}

/*
 * 剪切图片,这里我传的参数是file,因为我要根据图片的高宽来决定比例
 */
private void crop(File file) {
    // 裁剪图片意图
    Intent intent = new Intent("com.android.camera.action.CROP");
    FileInputStream fis = null;
    Bitmap bitmap = null;

    try {
        fis = new FileInputStream(file);
        bitmap = BitmapFactory.decodeStream(fis);
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    //把file转换成bitmap后,可以轻松的获得高宽
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

// Uri uri = Uri.fromFile(file);
localUri = Uri.fromFile(file);
// intent.putExtra(MediaStore.EXTRA_OUTPUT, localUri);
intent.setDataAndType(localUri, “image/*”);
intent.putExtra(“crop”, “true”);
// 裁剪框的比例,width:height
intent.putExtra(“aspectX”, width);
intent.putExtra(“aspectY”, height);
// intent.putExtra(“aspectX”, 1);
// intent.putExtra(“aspectY”, 1);
// 裁剪后输出图片的尺寸大小
intent.putExtra(“outputX”, 250);
intent.putExtra(“outputY”, 250 * height / width);

    intent.putExtra("outputFormat", "JPEG");// 图片格式

// intent.putExtra(“outputFormat”, Bitmap.CompressFormat.JPEG.toString());
intent.putExtra(“noFaceDetection”, true);// 取消人脸识别
// intent.putExtra(“return-data”, true);
intent.putExtra(“return-data”, true);
// 开启一个带有返回值的Activity,请求码为PHOTO_REQUEST_CUT
startActivityForResult(intent, PHOTO_REQUEST_RESULT);
}

/**
 * 保存裁剪之后的图片数据
 *
 * @param data
 */
private void getImageToView(Intent data) {
    Bundle extras = data.getExtras();
    if (extras != null) {
        Bitmap photo = extras.getParcelable("data");
        Drawable drawable = new BitmapDrawable(photo);
        imgv.setImageDrawable(drawable);
    }
}


public Bitmap decodeUriAsBitmap(Uri uri) {
    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeStream(getActivity().getContentResolver().openInputStream(uri));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return null;
    }
    return bitmap;

}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    switch (requestCode) {
        case PHOTO_REQUEST_CAREMA:
            if (SDCardHelper.getSDCardState()) {
                File file = new File(Environment.getExternalStorageDirectory(), IMAGE_FILE_NAME);
                crop(file);

// crop(Uri.fromFile(file));
} else {
Toast.makeText(getActivity(), “未找到存储卡,不能保存图片”, Toast.LENGTH_LONG).show();
}

            break;
        case PHOTO_REQUEST_GALLERY:
            if (data != null) {
                Uri uri = Uri.parse(data.getData().toString());

                String[] proj = {MediaStore.Images.Media.DATA};
                Cursor actualimagecursor = getActivity().managedQuery(uri, proj, null, null, null);
                int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                actualimagecursor.moveToFirst();
                String img_path = actualimagecursor.getString(actual_image_column_index);
                File file = new File(img_path);

                crop(file);
            }
            break;
        case PHOTO_REQUEST_RESULT:
            if (data != null) {
                getImageToView(data);
            }
            break;
    }
}

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnFragmentInteractionListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");
    }
}

@Override
public void onDetach() {
    super.onDetach();
    mListener = null;
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.local_btn:
            gallery();
            break;
        case R.id.camera_btn:
            camera();
            break;
    }
}

public interface OnFragmentInteractionListener {
    // TODO: Update argument type and name
    public void onFragmentInteraction(Uri uri);
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值