Android拍照

从本地相册获取照片

                                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在拍照前后内存波动





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值