Android相机应用程序-大位图处理



我有一些关于处理大位图的问题,我找不到关于我发现的这个问题讨论到目前为止的主题的答案。

我有一个Nexus S,当我用硬件拍照时。像这样的相机类:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] imageData, Camera c) {
        if (imageData != null) {
            BitmapFactory.decodeByteArray(imageData, 0, imageData.length, options);
        }
    }
};

考虑到图像是5MPixels,应用程序在decodeByteArray点崩溃。所以我想,如果这个崩溃了,那么它在Android的Camera应用中是怎么做的。

我下载了源代码,在那里我找到了makeBitmap方法:http://www.java2s.com/Open-Source/Android/android-platform-apps/Gallery/com/android/camera/Util.java.htm

所以我改变了我的回调使用makeBitmap:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
    public void onPictureTaken(byte[] imageData, Camera c) {
        if (imageData != null) {
            Bitmap bitmap = Utils.makeBitmap(imageData, 50 * 1024);
        }
    }
};

所以我采用了这种方法并在我的应用程序中使用。不仅我用这种方法创建的图像质量低,而且如果我使像素数量(50 * 1024)更大,我将有另一个OutOfMemory问题。

所以我的问题是,如果我想使用大的位图,我的意思是一个带有alpha图层的PNG,大小约为500x300,我该怎么做?如何在Android相机应用程序中创建大图实际上是完成的?

谢谢!

您将无法将那么大的位图放入内存以显示。

但是你可以保存位图:

byte[] imageData;
FileOutputStream out = new FileOutputStream(file);
out.write(imageData, 0, imageData.length);
out.flush();
out.close();

然后加载一个下采样版本以显示。

FileInputStream inputStream = new FileInputStream(file);
BitmapFactory.decodeStream(inputStream, null, options);

这样可以保持图像的原始大小,同时仍然能够显示图像而不会溢出。

注意:您需要使用选项来指定下载样本的数量。你可以把它放在try {} catch {}块和一个循环,增加downsample如果你不确定你需要的数量。

你可以尝试一些事情来释放内存,但不幸的是,它最终会归结为位图的大小

您可以做的一件事是在解码

后将imageData设置为null

最新更新