从本地相册获取照片
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION,
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
startActivityForResult(intent, RESULT_CAPTURE);
拍照完成返回获取结果
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == RESULT_CAPTURE) {
if (resultCode == RESULT_OK) {
ImageUtils.fixImageRotate(this, tempFile, tempFile, new ImageUtils.RotateImage() {
@Override
public void finishRotate(File image) {
Uri destImageUri = Uri.fromFile(tempFile);
cropImageUri(Uri.fromFile(image), destImageUri, cropImageWidth, cropImageHeight, CROP_PHOTO);
}
});
}
}
}
启动图片剪裁
/**
* 启动图片裁剪
*/
public void cropImageUri(Uri srcUri, Uri destUri, int outputX, int outputY, int requestCode) {
Intent intent = new Intent("com.android.camera.action.CROP");
intent.setDataAndType(srcUri, "image/*");
intent.putExtra("crop", "true");
intent.putExtra("aspectX", 1);
intent.putExtra("aspectY", 1);
intent.putExtra("outputX", outputX);
intent.putExtra("outputY", outputY);
intent.putExtra("scale", true);
intent.putExtra("scaleUpIfNeeded", true);// 去黑边
intent.putExtra(MediaStore.EXTRA_OUTPUT, destUri);
intent.putExtra(MediaStore.EXTRA_SCREEN_ORIENTATION, ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
if (imageFileType.endsWith("jpg")){
intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
}else{
intent.putExtra("outputFormat", Bitmap.CompressFormat.PNG.toString());
}
intent.putExtra("noFaceDetection", true); // no face detection
startActivityForResult(intent, requestCode);
}
涉及到Bitmap转换
/**
* 将 路径转换为 bitmap
* 根据图片路径 处理后返回bitmap
* 相对于直接使用 BitmapFactory.decodeFile(filePath); 有效防止OOM
* @param filePath 文件路径
* @param zoomLevel 缩放级别(建议是2的整倍数)
* @return
*/
public static Bitmap pathToBitmap(String filePath,int zoomLevel) {
try {
InputStream is = new FileInputStream(filePath);
return inputstremToBitmap(is,zoomLevel);
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}
/**
* 将 inputStrem 转换为bitmap
*
* @param is 文件字节流
* @param zoomLevel 缩放级别(建议为2的整倍数)
* @return
*/
public static Bitmap inputstremToBitmap(InputStream is,int zoomLevel) {
try {
BitmapFactory.Options opts = new BitmapFactory.Options();
// 内存中申请100k缓存空间
opts.inTempStorage = new byte[100 * 1024];
opts.inPreferredConfig = Bitmap.Config.RGB_565;
//设置图片可以被回收,创建Bitmap用于存储Pixel的内存空间在系统内存不足时可以被回收
opts.inPurgeable = true;
//设置位图缩放比例 width,hight设为原来的四分一(该参数请使用2的整数倍)
// 这也减小了位图占用的内存大小;例如,一张分辨率为2048*1536px的图像使用inSampleSize值为4的设置来解码,产生的Bitmap大小约为512*384px。相较于完整图片占用12M的内存,这种方式只需0.75M内存(假设Bitmap配置为ARGB_8888)。
opts.inSampleSize = zoomLevel;
//设置解码位图的尺寸信息
opts.inInputShareable = true;
//解码位图
Bitmap bitmap = BitmapFactory.decodeStream(is, null, opts);
// 返回所需bitmap
return bitmap;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
通过AS的Monitors可以直观的看到APP在拍照前后内存波动