android 不压缩保存位图
android save bitmap without compression
我正在研究 android。我需要保存一张没有质量损失的位图。
我已经尝试使用位图的 compress()
方法,将质量设置为 100。这对我不起作用,位图失去了太多质量。我测试过 JPEG 和 PNG 格式。
我测试过将位图复制到 ByteBuffer
,然后提取 byte[]
并使用 FileOutputStream
保存它。在这种情况下,我无法显示使用这种方式保存的图像,我只能看到一个空白页面。
我的问题是,有什么方法可以不压缩将位图保存在SD卡中吗?
编辑:这里是我的部分代码
public class MainActivity extends ActionBarActivity {
[...]
@Override
protected void onActivityResult(int reqCode, int resCode, Intent handler){
super.onActivityResult(reqCode, resCode, handler);
if(reqCode == CAPTURE_IDENTIFIER && resCode == Activity.RESULT_OK){
// THis is that I have tested.
// Object o = handler.getData();
// Object o2 = handler.getExtras().getParcelable("data");
// Object o3 = handler.getExtras().get("data");
// Object o4 = handler.getParcelableExtra("data");
//
prepareCapture();
startActivityForResult(cameraHandler, CAPTURE_IDENTIFIER);
}
}
private void initCamera(){
cameraHandler = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraHandler.putExtra("return-data", true);
}
private void prepareCapture(){
currentPhotoName = getNextImageIdentifier() + IMG_BASE_NAME;
File image = new File(capturesFolder, currentPhotoName);
Uri uriImage = Uri.fromFile(image);
cameraHandler.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);
}
}
我检测到的异常是:
RuntimeException:传递结果 ResultInfo [...] NullPointerException
失败
编辑2:
我实际要做的事情:
我必须用相机拍照,然后在保存之前,我必须处理它。之后,我必须将它保存在 SD 卡中。但是画质很重要,我不能用低画质保存,至少不要太低画质。
如果您使用的是 IMAGE_CAPTURE,则必须设置一个标志,以便 return 不是缩略图。
没有看到你的代码,我只能猜测。
文档:
Documentation Quote:
If the EXTRA_OUTPUT is not present, then a small sized image is
returned as a Bitmap object in the extra field
这是一个很常见的错误,如果是其他问题请澄清。
我已阅读 google 文档,这是我的理解,但我不确定 100%:
从 android 相机获取未压缩图像的唯一方法是将其保存在 SD 卡中。然后,如果你想使用它,从SD中获取它。
实际上,由于 intent 只能 "transport" 个 "small" 大小的对象,因此无法使用 intent 在活动之间传递未压缩的图像。
我正在研究 android。我需要保存一张没有质量损失的位图。
我已经尝试使用位图的 compress()
方法,将质量设置为 100。这对我不起作用,位图失去了太多质量。我测试过 JPEG 和 PNG 格式。
我测试过将位图复制到 ByteBuffer
,然后提取 byte[]
并使用 FileOutputStream
保存它。在这种情况下,我无法显示使用这种方式保存的图像,我只能看到一个空白页面。
我的问题是,有什么方法可以不压缩将位图保存在SD卡中吗?
编辑:这里是我的部分代码
public class MainActivity extends ActionBarActivity {
[...]
@Override
protected void onActivityResult(int reqCode, int resCode, Intent handler){
super.onActivityResult(reqCode, resCode, handler);
if(reqCode == CAPTURE_IDENTIFIER && resCode == Activity.RESULT_OK){
// THis is that I have tested.
// Object o = handler.getData();
// Object o2 = handler.getExtras().getParcelable("data");
// Object o3 = handler.getExtras().get("data");
// Object o4 = handler.getParcelableExtra("data");
//
prepareCapture();
startActivityForResult(cameraHandler, CAPTURE_IDENTIFIER);
}
}
private void initCamera(){
cameraHandler = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
cameraHandler.putExtra("return-data", true);
}
private void prepareCapture(){
currentPhotoName = getNextImageIdentifier() + IMG_BASE_NAME;
File image = new File(capturesFolder, currentPhotoName);
Uri uriImage = Uri.fromFile(image);
cameraHandler.putExtra(MediaStore.EXTRA_OUTPUT, uriImage);
}
}
我检测到的异常是: RuntimeException:传递结果 ResultInfo [...] NullPointerException
失败编辑2: 我实际要做的事情:
我必须用相机拍照,然后在保存之前,我必须处理它。之后,我必须将它保存在 SD 卡中。但是画质很重要,我不能用低画质保存,至少不要太低画质。
如果您使用的是 IMAGE_CAPTURE,则必须设置一个标志,以便 return 不是缩略图。
没有看到你的代码,我只能猜测。
文档:
Documentation Quote:
If the EXTRA_OUTPUT is not present, then a small sized image is returned as a Bitmap object in the extra field
这是一个很常见的错误,如果是其他问题请澄清。
我已阅读 google 文档,这是我的理解,但我不确定 100%:
从 android 相机获取未压缩图像的唯一方法是将其保存在 SD 卡中。然后,如果你想使用它,从SD中获取它。
实际上,由于 intent 只能 "transport" 个 "small" 大小的对象,因此无法使用 intent 在活动之间传递未压缩的图像。