将位图保存到Android存储而不会降低质量

时间:2014-11-25 23:45:09

标签: android image android-intent bitmap camera

现在我有一个打开手机相机应用程序的Intent,允许用户拍照,然后使用新图像返回我的应用程序。这样,它返回一个位图。为了获得图片的Uri以便我可以将ImageView设置为它,我相信我必须先将它保存到存储器中。唯一的问题是当我的应用程序打开它时,图像质量非常差。在我需要压缩的部分,我将质量保持在100,所以我不确定我做错了什么。

以下是我启动相机的方法:

Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(takePictureIntent, TAKE_PICTURE_INTENT_CODE);
}

以下是我处理它的方式:

//get result of image choosing
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
    super.onActivityResult(requestCode, resultCode, data);

    switch(requestCode) {

        case TAKE_PICTURE_INTENT_CODE:
            if(resultCode == RESULT_OK){
                Bundle extras = data.getExtras();
                Bitmap imageBitmap = (Bitmap) extras.get("data");
                try {
                    switchToCropFrag(createImageFileFromCamera(imageBitmap));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }else if (resultCode != RESULT_CANCELED){
                Toast.makeText(this, "Failed to get image, please try again.", Toast.LENGTH_LONG).show();
            } else {    //user cancelled image picking
        }
    }
}

private Uri createImageFileFromCamera(Bitmap imageBitmap) throws IOException {
        ContextWrapper cw = new ContextWrapper(getApplicationContext());
        File directory = cw.getDir("temp", Context.MODE_PRIVATE);
        // Create imageDir
        File path = new File(directory, "temp.png");

        FileOutputStream fos = null;
        try {

            fos = new FileOutputStream(path);

            // Use the compress method on the BitMap object to write image to the OutputStream
            imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return Uri.fromFile(path);
    }

对于switchToCropFrag,它只是使用Picasso设置图像。当我让用户选择他们手机中已经在他们的画廊中的照片时,图像质量很好。

1 个答案:

答案 0 :(得分:2)

  

这样,它返回一个位图

返回缩略图。引用the documentation

  

如果EXTRA_OUTPUT不存在,则在额外字段中返回小尺寸图像作为Bitmap对象

您似乎认为它正在返回一个常规尺寸的图像,但事实并非如此。

  

为了获得图片的Uri以便我可以将ImageView设置为它,我相信我必须先将它保存到存储中。

如果这是您活动中的ImageView,则不需要UriCall setImageBitmap()