android图片裁剪和缩放
2015-10-29 10:13
489 查看
初始变量定义
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";
}
}
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";
}
}
相关文章推荐
- Android 各种MIME类型和文件类型的匹配表
- android中Invalidate和postInvalidate的区别
- Android中AIDL及其使用
- android执行外部命令、检测文件是否存在、自动检测U盘路径
- Android ListView 异步加载图片乱序问题,原因分析及解决方案
- AndroidStudio的经典教程(干货)
- android 4.0 全屏 屏蔽下面的status bar
- 第一个简单的android项目
- Android Messenger 跨进程通信
- Android菜鸟的成长笔记——ViewPager图片循环
- Android 反编译
- 框架模式 MVC 在Android中的使用
- Android本地数据存储之SQLite
- android的消息机制——Handler机制
- Android Studio 快捷键整理分享
- Android实战简易教程-第六十七枪(android动画实现窗口抖动效果)
- Andriod界面设计适配和Android Studio中的资源
- Android M新控件之FloatingActionButton,TextInputLayout,Snackbar,TabLayout的使用
- Android Volley完全解析(四),带你从源码的角度理解Volley
- 需求,刚做android,这个布局想请加各位大神如何写