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





















发布了59 篇原创文章 · 获赞 4 · 访问量 4万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览