Android拍照

    xiaoxiao2022-06-24  22

    从本地相册获取照片

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

    转载请注明原文地址: https://ju.6miu.com/read-1123607.html

    最新回复(0)