现在我有一个打开手机相机应用程序的Intent,允许用户拍照,然后使用新图像返回我的应用程序。这样,它返回一个位图。为了获得图片的Uri以便我可以将ImageView设置为它,我相信我必须先将它保存到存储器中。唯一的问题是当我的应用程序打开它时,图像质量非常差。在我需要压缩的部分,我将质量保持在100,所以我不确定我做错了什么。
以下是我启动相机的方法:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
startActivityForResult(takePictureIntent, TAKE_PICTURE_INTENT_CODE);
}
以下是我处理它的方式:
//get result of image choosing
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
switch(requestCode) {
case TAKE_PICTURE_INTENT_CODE:
if(resultCode == RESULT_OK){
Bundle extras = data.getExtras();
Bitmap imageBitmap = (Bitmap) extras.get("data");
try {
switchToCropFrag(createImageFileFromCamera(imageBitmap));
} catch (IOException e) {
e.printStackTrace();
}
}else if (resultCode != RESULT_CANCELED){
Toast.makeText(this, "Failed to get image, please try again.", Toast.LENGTH_LONG).show();
} else { //user cancelled image picking
}
}
}
private Uri createImageFileFromCamera(Bitmap imageBitmap) throws IOException {
ContextWrapper cw = new ContextWrapper(getApplicationContext());
File directory = cw.getDir("temp", Context.MODE_PRIVATE);
// Create imageDir
File path = new File(directory, "temp.png");
FileOutputStream fos = null;
try {
fos = new FileOutputStream(path);
// Use the compress method on the BitMap object to write image to the OutputStream
imageBitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
return Uri.fromFile(path);
}
对于switchToCropFrag,它只是使用Picasso设置图像。当我让用户选择他们手机中已经在他们的画廊中的照片时,图像质量很好。
答案 0 :(得分:2)
这样,它返回一个位图
返回缩略图。引用the documentation:
如果EXTRA_OUTPUT不存在,则在额外字段中返回小尺寸图像作为Bitmap对象
您似乎认为它正在返回一个常规尺寸的图像,但事实并非如此。
为了获得图片的Uri以便我可以将ImageView设置为它,我相信我必须先将它保存到存储中。
如果这是您活动中的ImageView
,则不需要Uri
。 Call setImageBitmap()