2012-06-25 35 views
2

我只想从我的应用程序中打开本机相机应用程序来捕捉照片并将其设置为我的屏幕的背景图像,然后旋转它按钮的按钮。如果使用300万像素摄像头拍摄,照片将旋转n次。如果我将相机分辨率设置为5MP或更高,则应用程序会在第5次点击按钮时强制关闭(照片旋转4次)。在android中处理大位图

Bitmap rotatedBitmap = null; 
int curAngle = 0; 

private Bitmap rotateImageBitmap(Bitmap capturedPhotoBitmap) {  

if(rotatedBitmap != null ) 
{ 
    rotatedBitmap = null; 
} 

Matrix matrix = new Matrix(); 
curAngle = (curAngle + 90) % 360; 
matrix.postRotate(curAngle); 
rotatedBitmap = Bitmap.createBitmap(capturedPhotoBitmap, 0, 0, capturedPhotoBitmap.getWidth(), capturedPhotoBitmap.getHeight(), matrix, true); 

return rotatedBitmap;   
} 

这是从开发指南....
1. 移动设备通常具有受限的系统资源。 Android设备可以为单个应用程序提供低至16MB的内存。

2. 位图占用大量内存,特别是对于像照片这样的丰富图像。例如,Galaxy Nexus上的相机拍摄高达2592x1936像素(500万像素)的照片。如果使用的位图配置是ARGB_8888(Android 2.3以后的默认设置),则将该图像加载到内存中需要大约19MB的内存(2592 * 1936 * 4字节),立即耗尽了某些设备上的每应用程序限制。

现在大多数手机的摄像头都是8mp或更高。所以图片会很大。 如何在不打扰相机分辨率的情况下旋转我的照片'n'次数。我需要压缩它吗?什么是最好的方法?请帮帮我。

回答

0

而不是在RAM的堆上有图像,我会将图像加载(读取:缓冲区)到应用程序缓存目录中的磁盘上。 http://developer.android.com/reference/android/content/Context.html#getCacheDir()

将图像放在磁盘上后,我会使用样本大小将其充入内存以减少内存消耗。

参见http://developer.android.com/reference/android/graphics/BitmapFactory.Options.html#inSampleSizehttp://developer.android.com/reference/android/graphics/BitmapFactory.html

您选择的样本大小是相对于所述位图(以像素为单位)的大小和视图的大小你在图像加载到(以像素为单位)。

要查找图像的尺寸,请使用BitmapFactory.Options对象中的“inJustDecodeBounds”选项。

请记住,您选择的样本大小应该是2的幂数。数字越高,保存的内存越多,但图像质量越低。

样本大小2 =大小的1/4。样本大小4 = 1/16大小等