簡體   English   中英

使用位圖的圖像質量問題

[英]Image Quality problems using 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);
    }
}

}

在此處輸入圖片說明

您正在壓縮此行中的位圖。

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

更改為

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

如上面的回答,第二個參數用於質量壓縮(Bitmap.CompressFormat格式,int質量,OutputStream流)

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帖子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM