Проблемы с качеством изображения при использовании растрового изображения - PullRequest
0 голосов
/ 02 июня 2018

Я новичок в 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 голосов
/ 02 июня 2018

Как указано выше, второй параметр относится к сжатию качества (формат Bitmap.CompressFormat, качество int, поток OutputStream)

0 голосов
/ 02 июня 2018
Intent takePhotoIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePhotoIntent.resolveActivity(getPackageManager()) != null) {
    startActivityForResult(takePhotoIntent, TAKE_PICTURE_CAM);
}

Это даст вам только миниатюру изображения, и приложение камеры выбросит полное изображение, чтобы файл изображения отсутствовал.

Вы должны добавить

takePhotoIntent.putExtra(Intent.EXTRA_OUTPUT, fileprovideruri ). 
* 1006.* с помощью которого вы сообщаете приложению камеры, где хранить изображение.

Вы # 12345, который сталкивается с этой функцией Android.

Если вы немного погуглите за extra_output, вы найдете сотни сообщений переполнения стекарешение вашей проблемы.

0 голосов
/ 02 июня 2018

Вы сжимаете растровое изображение в этой строке.

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

Измените его на

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