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