从相机捕捉时图像尺寸和尺寸减小

时间:2017-12-11 09:44:20

标签: android

用它打开相机:

 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                        startActivityForResult(intent, REQUEST_CAMERA);

OnActivityResult

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (data != null) {
             if (requestCode == REQUEST_CAMERA && resultCode == RESULT_OK) 
            {
                onCaptureImageResult(data);
            }
        }



private void onCaptureImageResult(Intent data) {

        if (data != null) {    
            cameraBitMap = (Bitmap) data.getExtras().get("data");
            ByteArrayOutputStream bytes = new ByteArrayOutputStream();
            cameraBitMap.compress(Bitmap.CompressFormat.JPEG,100, bytes);
             cameraFilePath = new File(Environment.getExternalStorageDirectory(),
                    System.currentTimeMillis() + ".jpg");
            FileOutputStream fo;
            try {
                cameraFilePath.createNewFile();
                fo = new FileOutputStream(cameraFilePath);
                fo.write(bytes.toByteArray());
                fo.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }

            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(cameraFilePath.getAbsolutePath(), options);

            imageHeight = options.outHeight;
            imageWidth = options.outWidth;

            camImagePath = String.valueOf(cameraFilePath);
            String fileName = camImagePath.substring(camImagePath.lastIndexOf("/") + 1);

            txt_FileName.setText(fileName);
            txt_FileName.setVisibility(View.VISIBLE);
            btn_ImageTest.setImageBitmap(cameraBitMap);
        }

    }

enter image description here

我希望从相机中捕捉原始大小的图像。

2 个答案:

答案 0 :(得分:0)

像这样使用Intent。这里首先给出图像名称。

//declare globally
private static final int CAMERA_CODE = 101 ;
private Uri mImageCaptureUri;

如下所示启动意图。

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File f = new File(android.os.Environment.getExternalStorageDirectory(), "temp1.jpg");
if (f.exists()) {
      f.delete();
}
mImageCaptureUri = Uri.fromFile(f);
intent.putExtra(MediaStore.EXTRA_OUTPUT, mImageCaptureUri);
startActivityForResult(intent, CAMERA_CODE);

onActivityResult

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);  
    if (requestCode == CAMERA_CODE && resultCode == RESULT_OK) {

        System.out.println("Camera Image URI : " + mImageCaptureUri);

        String path = mImageCaptureUri.getPath();
        if (new File(path).exists()) {
            Toast.makeText(MainActivity.this, "Path is Exists..", Toast.LENGTH_LONG).show();
        }
        btn_ImageTest.setImageURI(mImageCaptureUri);
    }
}

答案 1 :(得分:0)

您需要在启动Camera Activity Intent之前创建临时文件。

在使用相机拍摄图像之后使用下面的代码或类似内容的任何东西实际上都是缩略图,这会降低原始质量。

这是我的意思:

Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
mImageView.setImageBitmap(imageBitmap);

Refer Here for more info

这是您想要的解决方案

  1. 首先您需要创建临时文件。
  2. 将临时文件转换为URI
  3. 使用putExtra方法将URI数据传递给Camera意图。
  4. 打开相机活动意图。
  5. 如果用户取消或接受来自Camera Activity意图的图像,请处理onActivityResult。
  6. 以下是您可以逐步使用的方法。

    创建临时文件。

    private File createImageFile() throws IOException {
    // Create an image file name
    String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
    String imageFileName = "JPEG_" + timeStamp + "_";
    File storageDir = getExternalFilesDir(Environment.DIRECTORY_PICTURES);
    File image = File.createTempFile(
        imageFileName,  /* prefix */
        ".jpg",         /* suffix */
        storageDir      /* directory */
    );
    
    // Save a file: path for use with ACTION_VIEW intents
    mCurrentPhotoPath = image.getAbsolutePath();
    return image;
    }
    

    将临时文件转换为URI并调用相机活动意图。

    static final int REQUEST_TAKE_PHOTO = 1;
    Uri photoURI;
    File photoFile;
    private void dispatchTakePictureIntent() {
    Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    // Ensure that there's a camera activity to handle the intent
    if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
        // Create the File where the photo should go
        photoFile = null;
        try {
            photoFile = createImageFile();
        } catch (IOException ex) {
            // Error occurred while creating the File
            ...
        }
        // Continue only if the File was successfully created
        if (photoFile != null) {
            photoURI = FileProvider.getUriForFile(this,
                                                  "com.example.android.fileprovider",
                                                  photoFile);
            takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
            startActivityForResult(takePictureIntent, REQUEST_TAKE_PHOTO);
        }
    }
    }
    

    现在,您已经在调用Camera Activity意图之前创建了文件位置路径。您可以处理RESULT_OK(显示图像)或RESULT_CANCELED(删除临时图像)。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == REQUEST_TAKE_PHOTO && resultCode == RESULT_OK) {            
            mImageView.setImageURI(photoURI );
        }else{
           photoFile.delete();
        }
    }
    

    *注意getUriForFile,它返回一个content:// URI。对于针对Android 7.0(API级别24)及更高版本的更新应用,在包边界上传递file:// URI会导致FileUriExposedException。因此,我们现在提供一种使用FileProvider存储图像的更通用的方法。 完整文档可供参考。

    Taking Photo Simply