android图片裁剪和缩放

初始变量定义

    private static final int PICK_PHOTO = 2;  //从SD卡中得到图片
    private static final int TAKE_PHOTO = 1;// 拍摄照片
    private static final int RESULT_TAKE=3;  //结果处理
    private static final int RESULT_PICK=4;  //结果处理
    private static final String IMAGE_UNSPECIFIED="image/*";
    private static final int  WIDTH=450;   //图片缩放的宽度
    private static final int  HEIGHT=350;   //图片缩放的高度
    private static  String tempFilePath;   //拍照获得图片的绝对路径
    private static final String temp="/temp"; //保存图片的临时文件
    private static Uri pickPhoto;   //选取相册图片uri
private ImageView iv;

通过调用相机判断是否存在sd卡并将拍照后的图片存到对应目录(不存也是可以的,但是许多手机返回结果不同要做处理,下会讲到)

String state =Environment.getExternalStorageState();
if(state.equals(Environment.MEDIA_MOUNTED)){
try {
String Path=Environment.getExternalStorageDirectory()+temp;
File tempfile =new File(Path);
if(!tempfile.exists()){
tempfile.mkdirs();
}
tempFilePath=tempfile+"/"+getPhotoFileName();
Intent cameraIntent =new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT,Uri.fromFile(new File(tempFilePath)));
startActivityForResult(cameraIntent,TAKE_PHOTO);
} catch (Exception e) {
e.printStackTrace();
}
}else{
Toast.makeText(getApplicationContext(), "请确认已插入SD卡",Toast.LENGTH_SHORT).show();
}

通过从相册中选取

try {
Intent intent =new Intent();
intent.setType(IMAGE_UNSPECIFIED);
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent,PICK_PHOTO);
} catch (Exception e) {
e.printStackTrace();
}

回调onActivityResult函数处理

switch (requestCode) {
case TAKE_PHOTO:   

//当拍照图片不存到sd卡时即直接返回拍照结果则此时data不为null,存到sd卡则data=null走else部分

f (resultCode == RESULT_OK && null != data) {

Bitmap camorabitmap;
Uri mImageCaptureUri=data.getData();
//当uri为空时,直接获取bitmap对象
if(mImageCaptureUri==null){
camorabitmap = data.getParcelableExtra("data");

//进行了相应的缩放并显示
//缩放易挤压变形
int width = camorabitmap.getWidth();    
       int height = camorabitmap.getHeight();    
       int newWidth = WIDTH;    
       int newHeight = HEIGHT;    
       float scaleWidth = ((float) newWidth) / width;    
       float scaleHeight = ((float) newHeight) / height;    
 
       Matrix matrix = new Matrix();    
       matrix.postScale(scaleWidth, scaleHeight);    
//         matrix.postRotate(90);     
       Bitmap resizedBitmap = Bitmap.createBitmap(camorabitmap, 0, 0, width,    
                       height, matrix, true);
iv.setImageBitmap(resizedBitmap);
}else{

//进行了相应的裁剪并显示
//通过uri获取数据
startPhotoZoom(mImageCaptureUri,RESULT_TAKE);
}
}
//图片存储到对应临时文件加下 并进行裁剪显示
else{
Uri mImageCaptureUri=Uri.parse(tempFilePath);
       startPhotoZoom(mImageCaptureUri,RESULT_TAKE);
}

case PICK_PHOTO:
if (resultCode == RESULT_OK && null != data) {
Uri selectedImage;
if(data.getData()!=null){
selectedImage=data.getData();
pickPhoto=selectedImage;
startPhotoZoom(selectedImage,RESULT_PICK);
}else{
Bitmap bitmap = data.getParcelableExtra("data");
selectedImage = Uri.parse(MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, null,null));
pickPhoto=selectedImage;
startPhotoZoom(selectedImage,RESULT_PICK);
}

case RESULT_TAKE:

//此处是用sk卡路径即uri进行操作的这样避免oom和一些机型不同造成返回结果不同的问题

Bitmap takebitmap=null;
try {
Uri mImageCaptureUri=Uri.fromFile(new File(tempFilePath));
takebitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(mImageCaptureUri));
iv.setImageBitmap(takebitmap);
} catch (FileNotFoundException e) {
e.printStackTrace();
};
break;

case RESULT_PICK:
if(data!=null){
Bitmap pickbitmap;
Uri imageUri =data.getData();
if(imageUri!=null){
pickbitmap = decodeUriAsBitmap(imageUri);
iv.setImageBitmap(pickbitmap);
}else{
pickbitmap = data.getParcelableExtra("data");
iv.setImageBitmap(pickbitmap);
}

}

else{
try {
Bitmap tempPick=takebitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(pickPhoto));
iv.setImageBitmap(tempPick);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
break;
default:
break;

}

public void startPhotoZoom(Uri uri) {
Intent intent = new Intent("com.android.camera.action.CROP");    
       intent.setDataAndType(uri,IMAGE_UNSPECIFIED);    
       intent.putExtra("crop", "true");    
       // aspectX aspectY 是宽高的比例    
       intent.putExtra("aspectX", 2);    
       intent.putExtra("aspectY", 1);    
       // outputX outputY 是裁剪图片宽高    
       intent.putExtra("outputX",450);    
       intent.putExtra("outputY",450);
       intent.putExtra("return-data", true);  //为true时即不返回bitmap 利用url对图片进行操作
       startActivityForResult(intent, RESULT);  
}

private Bitmap decodeUriAsBitmap(Uri uri){
   Bitmap bitmap = null;
   try {
    ContentResolver cr=getContentResolver();
       bitmap = BitmapFactory.decodeStream(cr.openInputStream(uri));
   } catch (FileNotFoundException e) {
       e.printStackTrace();
       return null;
   }
   return bitmap;
}
/**
* 用时间戳生成照片名称

* @return
*/
private String getPhotoFileName() {
Date date = new Date(System.currentTimeMillis());
SimpleDateFormat dateFormat = new SimpleDateFormat(
"yyyyMMdd_HHmmss");
return dateFormat.format(date) + ".jpg";
}
 
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值