Android 常用的拍照和裁剪,這里調(diào)用系統(tǒng)的相機(jī)和裁剪,獲取到圖片,這里是返回獲取到資源的代碼,在onActivityResult里,
if (requestCode == CHOOSE_COVER && resultCode == RESULT_OK) {
Uri data1 = data.getData(); //裁剪
ImageUtils.getInstance(this).cropImageUri(this, data1, 360, 202, CROP);
} else if (requestCode == CROP && resultCode == RESULT_OK) { //顯示
Bitmap bitmap = null;
if(data.getData()!=null){
try {
bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStrea(data.getData()));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}else if(data.getExtras()!=null){
Bundle extras = data.getExtras();
bitmap = (Bitmap) extras.get("data");
}
/** * 圖片裁剪
* @param context
* @param uri
* @param outputX
* @param outputY
* @param requestCode
*/
public void cropImageUri(Activity context, Uri uri, int outputX, int outputY, int requestCode{
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(uri, "image/*");
intent.putExtra("crop", "true");
// aspectX aspectY 是寬高的比例//
intent.putExtra("aspectX", 16);//
intent.putExtra("aspectY", 9);
// outputX outputY 是裁剪圖片寬高
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("return-data", true);//默認(rèn)不輸出
intent.putExtra("noFaceDetection", true);
context.startActivityForResult(intent, requestCode);
}
圖片裁剪,直接調(diào)用系統(tǒng)的裁剪方法如下:
Intent intent1 = new Intent("com.android.camera.action.CROP");
intent1.setDataAndType(Uri.fromFile(new File(path)), "image/*");
intent1.putExtra("crop", "true");
newName = System.currentTimeMillis();
destDirs = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/"+ AppConstants.PATH+"/"+newName);
intent1.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(destDirs));//
intent1.putExtra("outputFormat", Bitmap.CompressFormat.JPEG);
intent1.putExtra("scale", true);
intent1.putExtra("scaleUpIfNeeded", true);
intent1.putExtra("return-data", false);
startActivityForResult(intent1, 1);
獲取到裁剪之后的圖片資源
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1&&data!=null){
Bundle extras = data.getExtras();
Bitmap photo=null;
if(extras!=null){
photo = (Bitmap) extras.get("data");
}
if (photo!=null&&!photo.equals("null")) {
getCrop(photo); //獲取到bitmap
}else if(data.getData()!=null){
Uri uri = data.getData();
if((data.getData()+"").startsWith("file")){
Bitmap bitmapCopy=BitmapFactory.decodeFile((data.getData()+"").substring(8,(data.getData()+"").length()),options).copy(Bitmap.Config.ARGB_4444,true);
getCrop(bitmapCopy); //獲取到bitmap
FileUtil.deleteFile((data.getData()+"").substring(8,(data.getData()+"").length())); //刪除文件
return;
}else {
if(data.getData()==null||getContentResolver().query(uri, null, null, null,null)==null){
imageViewCamera.setImageResource(R.mipmap.beijing_1);
Toast.makeText(MainActivity.this, "獲取圖片失敗,請(qǐng)從相冊(cè)選擇!", Toast.LENGTH_SHORT).show();
return;
}
String imagePath = null;
Cursor cursor = getContentResolver().query(uri, null, null, null,null);
if (cursor != null && cursor.moveToFirst()) {
imagePath = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA));
cursor.close();
}
Bitmap bitmapCopy=BitmapFactory.decodeFile(imagePath,options).copy(Bitmap.Config.ARGB_4444,true);
getCrop(bitmapCopy); //獲取到bitmap
FileUtil.deleteFile(imagePath); //刪除文件
}
}
}
}
圖片壓縮大小,可以選擇失真壓縮,改變分辨率,也可以在不改變分辨率的情況下壓縮,下面是在不改變圖片質(zhì)量的情況下壓縮圖片,在這里記錄一下
public static Bitmap getSmallBitmap(String path){
//new 出來一個(gè)bitmap的參數(shù)
BitmapFactory.Options options=new BitmapFactory.Options();
//設(shè)置為true,不會(huì)生成bitmao對(duì)象,只是讀取尺寸和類型信息
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile(path, options);
//得到這個(gè)比例 并賦予option里面的inSampleSize
options.inSampleSize = calculateInSampleSizes(options, 320, 480);
//設(shè)置為false,即將要生成bitmap對(duì)象啦
options.inJustDecodeBounds = false;
//有了這個(gè)option,我們可以生成bitmap對(duì)象了
Bitmap bitmap=BitmapFactory.decodeFile(path, options);
return bitmap;
}
public static int calculateInSampleSizes(BitmapFactory.Options options,int reqHeight,int reqWidth){
//得到原始圖片寬高
int height=options.outHeight;
int width=options.outWidth;
//默認(rèn)設(shè)置為1,即不縮放
int inSampleSize=1;
//如果圖片原始的高大于我們期望的高,或者圖片的原始寬大于我們期望的寬,換句話意思就是,我們想讓它變小一點(diǎn)
if (height > reqHeight || width > reqWidth) {
//原始的高除以期望的高,得到一個(gè)比例
final int heightRatio = Math.round((float) height/ (float) reqHeight);
//原始的寬除以期望的寬,得到一個(gè)比例
final int widthRatio = Math.round((float) width / (float) reqWidth);
//取上面兩個(gè)比例中小的一個(gè),返回這個(gè)比例
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
調(diào)用方法
在這里就可以獲取到壓縮之后的圖片
Bitmap bitmap=ImageUtils.getSmallBitmap(path);//圖片處理,壓縮大小