产片又提要求了,上传证件照的时候,要按照比例来剪裁,以前切头像,都是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);
}
}