关于处理大位图我几乎没有问题,到目前为止我找到的问题我找不到答案。
我有一个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应用程序中创建大图像?
谢谢!
答案 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>