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

时间:2011-12-16 12:09:45

标签: java android graphics

关于处理大位图我几乎没有问题,到目前为止我找到的问题我找不到答案。

我有一个Nexus S,当我用hardware.Camera类拍摄图片时这样:

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的相机应用程序中完成的。

我下载了源代码,然后在那里找到了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问题。

所以我的问题是,如果我想使用大位图,而且我的意思是指大小为500x300的alpha图层的PNG,我该怎么办呢?如何在Android Camera应用程序中创建大图像?

谢谢!

2 个答案:

答案 0 :(得分:0)

有一些事情你可以尝试释放内存,但不幸的是它最终会降低到位图的大小

您可以做的一件事是在解码后将imageData设置为null

答案 1 :(得分:0)

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

但是你可以省略位图:

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 {}块和一个循环中,如果你不确定你需要的数量,它会增加下采样。<​​/ p>