繁体   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