使用位图的图像质量问题

时间:2018-06-02 08:43:30

标签: java android image-processing bitmap

我是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);
    }
}

}

enter image description here

3 个答案:

答案 0 :(得分:2)

您正在压缩此行中的位图。

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

将其更改为

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

答案 1 :(得分:0)

如上所述,第二个参数是针对质量的 compress(Bitmap.CompressFormat格式,int quality,OutputStream流)

答案 2 :(得分:0)

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功能。

如果你稍微google一下extra_output,你会发现数百个stackoverflow帖子处理你的问题。