Android: Intent:传递未压缩的位图

5
我正在开发Android应用。我需要保存一张位图而不会损失质量。
我尝试使用Bitmap的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卡中。但图像质量非常重要,我不能以低质量保存它,至少不能太低。

我已经测试了JPEG和PNG格式(Bitmap.compress可用的格式)的质量为100和较低质量。 - Dan
1
你能开始解释一下你的代码应该做什么,而不是谈论位图吗?你的代码中没有任何位图相关的内容。 - greenapps
这只是一小段代码,第一个startActivity在其他地方,这里在onActivityResult中添加更多的照片,以便在第一个之前。 - Dan
那么我必须使用没有 EXTRA_OUTPUT 的 intent,对吗?好的,我已经尝试过了,并且已经从 Intent 中获取了位图,我的问题是如何在不损失质量的情况下将其保存在 SD 卡中。 - Dan
请删除所有代码,只发布演示您问题的相关代码。 - greenapps
显示剩余10条评论
2个回答

1
我已经阅读了谷歌文档,这是我的理解,但我不能确定100%:
从Android相机获取未压缩图像的唯一方法是将其保存在SD卡中。然后,如果您想使用它,请从SD卡获取。
确实,无法通过使用意图在活动之间传递未压缩的图像,因为意图只能“传输”“小”的对象。

0

如果您正在使用IMAGE_CAPTURE,有一个标志必须设置为不返回缩略图。

没有看到您的代码,我只能猜测。

文档:

Image Capture Reference

文档引用:

如果EXTRA_OUTPUT不存在,则会在extra字段中返回一个小尺寸的图像作为Bitmap对象

这是一个非常常见的错误,请澄清是否还有其他问题。


我没有使用 EXTRA_OUTPUT,因为如果我使用它,在 "onActivityResult" 中尝试获取图像时,getData() 和 getExtra("data") 都会返回 null。 - Dan
只有参数Intent data==null。 - greenapps
现在我甚至无法执行getData()或getExtras.getParceable("data"),会出现异常。 - Dan
确实。是什么类型的异常?为什么要省略这么重要的信息?此外,仅提供getData()不足够。在这种情况下,请显示整个语句。 - greenapps
我添加了额外的信息。我本来想避免这样做,因为我认为可能有一些函数可以保存未压缩的位图,这样就不需要这些信息了。 - Dan
你应该已经告诉我们你的位图是从哪里来的了,但是你还没有。 - greenapps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接