【问题标题】:Image Quality problems using bitmap使用位图的图像质量问题
【发布时间】:2018-11-12 06:48:15
【问题描述】:

我是 Android Studio 的初学者,我正在尝试使用默认的 android 相机拍照,并将其保存在特定文件夹的图库中,但图像质量存在问题。它的图像 请告诉我要对我的代码进行哪些更改

这是我的代码:

public class AddPhoto extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
    setContentView(R.layout.activity_add_photo);

    imageview = (ImageView) findViewById(R.id.viewimage);
    ActivityCompat.requestPermissions(AddPhoto.this,
            new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},
            1);

}

private static final int TAKE_PICTURE_CAM = 1;
private static final int TAKE_PICTURE_GALLERY = 2;
private ImageView imageview;
private static final String IMAGE_DIRECTORY = "/IKnow";



@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1: {

            if (grantResults.length > 0
                    && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            } else {
                Toast.makeText(AddPhoto.this, "Permission denied to read your External storage", Toast.LENGTH_SHORT).show();
            }
            return;
        }
    }
}

private void takePhoto() {
    Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    if (takePhotoIntent.resolveActivity(getPackageManager()) != null) {
        startActivityForResult(takePhotoIntent, TAKE_PICTURE_CAM);
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == this.RESULT_CANCELED) {
        return;
    }
    if (requestCode == TAKE_PICTURE_GALLERY) {
        if (data != null) {
            Uri contentURI = data.getData();
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), contentURI);
                String path = saveImage(bitmap);
                Toast.makeText(AddPhoto.this, "Image Saved!", Toast.LENGTH_SHORT).show();
                imageview.setImageBitmap(bitmap);

            } catch (IOException e) {
                e.printStackTrace();
                Toast.makeText(AddPhoto.this, "Failed!", Toast.LENGTH_SHORT).show();
            }
        }

    } else if (requestCode == TAKE_PICTURE_CAM) {
        Bitmap thumbnail = (Bitmap) data.getExtras().get("data");
        imageview.setImageBitmap(thumbnail);
        saveImage(thumbnail);
        Toast.makeText(AddPhoto.this, "Image Saved!", Toast.LENGTH_SHORT).show();
    }
}

public String saveImage(Bitmap myBitmap) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    myBitmap.compress(Bitmap.CompressFormat.JPEG, 50, bytes);
    File wallpaperDirectory = new File(
            Environment.getExternalStorageDirectory() + IMAGE_DIRECTORY);
    if (!wallpaperDirectory.exists()) {
        wallpaperDirectory.mkdirs();
    }

    try {
        File f = new File(wallpaperDirectory, Calendar.getInstance()
                .getTimeInMillis() + ".jpg");
        f.createNewFile();
        FileOutputStream fo = new FileOutputStream(f);
        fo.write(bytes.toByteArray());
        MediaScannerConnection.scanFile(this,
                new String[]{f.getPath()},
                new String[]{"image/jpeg"}, null);
        fo.close();
        Log.d("TAG", "File Saved::--->" + f.getAbsolutePath());

        return f.getAbsolutePath();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    return "";
}
public void buttonOnClick(View view) {
    switch (view.getId()) {

        case R.id.cameraButton:

            takePhoto();
            break;

        case R.id.nextButton:

            Intent intent = new Intent (AddPhoto.this, MainActivity.class);
            AddPhoto.this.startActivity(intent);
    }
}

}

【问题讨论】:

标签: java android image-processing bitmap


【解决方案1】:

您正在压缩这一行中的位图。

myBitmap.compress(Bitmap.CompressFormat.JPEG, 50, bytes);

改成

myBitmap.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

【讨论】:

    【解决方案2】:

    如上所述,第二个参数用于质量 compress(Bitmap.CompressFormat 格式, int 质量, OutputStream 流)

    【讨论】:

      【解决方案3】:
      Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
      if (takePhotoIntent.resolveActivity(getPackageManager()) != null) {
          startActivityForResult(takePhotoIntent, TAKE_PICTURE_CAM);
      }
      

      这只会为您提供图像的缩略图,并且相机应用会丢弃完整图像,因此没有图像文件。

      你应该添加一个

      takePhotoIntent.putExtra(Intent.EXTRA_OUTPUT, fileprovideruri ). 
      

      你告诉相机应用程序在哪里存储图像。

      你是#12345,遇到了这个android功能。

      如果您搜索一下 extra_output,您会发现数百个 stackoverflow 帖子正在处理您的问题。

      【讨论】:

      • 当然可以。但如果你不想要帮助。好吧。好的。
      • 图像的预览仍然模糊,我需要帮助,这就是我在这里发布的原因。
      • 哦..我没有看到您尝试过的代码,并且您刚刚说它不起作用。寻求帮助的错误方式。
      • 我按照你的建议试过了,我没有出错,但我拍照后预览还是一样。我什至在问这里之前就试过了,但我看到预览仍然模糊,我认为没有任何改变,我没有检查画廊。但是照片保存在画廊后就可以了。我可以以某种方式删除预览或做些什么?非常感谢您的帮助!
      • 目前还不清楚您认为什么是预览版。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-10-27
      • 2017-06-22
      • 1970-01-01
      • 2014-04-12
      • 2015-05-30
      • 2014-05-01
      • 1970-01-01
      相关资源
      最近更新 更多