加载到内存前检查Android图像大小
我创建了一个小应用程序,可以处理来自画廊或照相机的图像 这一切都很好,但是。 在小屏幕和小内存(HTC Desire)的设备上,我从其他手机下载了一些全尺寸的图像,它们要大得多(手机上有8MP摄像头) 如果我尝试加载它,对于我的小型相机的巨大图像,它会立即崩溃 那么,如何执行某种检查并缩小该图像,但仍然正确加载它 我确实会在加载图像后缩小它们,但这是在崩溃出现之前应该做的事情 Tnx加载到内存前检查Android图像大小,android,Android,我创建了一个小应用程序,可以处理来自画廊或照相机的图像 这一切都很好,但是。 在小屏幕和小内存(HTC Desire)的设备上,我从其他手机下载了一些全尺寸的图像,它们要大得多(手机上有8MP摄像头) 如果我尝试加载它,对于我的小型相机的巨大图像,它会立即崩溃 那么,如何执行某种检查并缩小该图像,但仍然正确加载它 我确实会在加载图像后缩小它们,但这是在崩溃出现之前应该做的事情 Tnx 您可以避免仅通过设置在内存中加载位图 inJustDecodeBounds = true 将允许您仅解码图像的
您可以避免仅通过设置在内存中加载位图
inJustDecodeBounds = true
将允许您仅解码图像的边界,而不解码它。给定位图的高度
和宽度
,可以使用
当文件停留时:
如果设置为大于1的值,则请求解码器对原始数据进行二次采样
图像,返回较小的图像以节省内存
int-tmpWidth=位图宽度;
int tmpHeight=位图高度;
int requiredSize=。。。
while(true){
如果(tmpWidth/2<所需尺寸
||t灯光/2<所需尺寸)
打破
tmpWidth/=2;
tmpHeight/=2;
比率*=2;
}
编辑:对于32位
位图
所需的内存为宽度*高度*4
您可以避免在内存中加载位图,只需设置
inJustDecodeBounds = true
将允许您仅解码图像的边界,而不解码它。给定位图的高度
和宽度
,可以使用
当文件停留时:
如果设置为大于1的值,则请求解码器对原始数据进行二次采样
图像,返回较小的图像以节省内存
int-tmpWidth=位图宽度;
int tmpHeight=位图高度;
int requiredSize=。。。
while(true){
如果(tmpWidth/2<所需尺寸
||t灯光/2<所需尺寸)
打破
tmpWidth/=2;
tmpHeight/=2;
比率*=2;
}
编辑:对于32位
位图
所需的内存是宽度*高度*4
我必须承认,我没有得到你的答案。我会用代码编辑我的问题,所以我试着把它放在任何屏幕上,阅读屏幕大小,可能还有屏幕密度,但还是太大了。我一定是遗漏了一些关于比率/密度的信息。我认为它太大了(800或480)。尝试设置inSampleSize=8我遇到了一个奇怪的情况,如果我尝试手动设置,SampleSize 3会使我的图像比我想要的大两倍,SampleSize 4会使图像变小……这不可能是真的。如果将inSampleSize设置为3,则结果图像必须是原始图像宽度/高度的1/3。我无法得到您的答案。我会用代码编辑我的问题,所以我试着把它放在任何屏幕上,阅读屏幕大小,可能还有屏幕密度,但还是太大了。我一定是遗漏了一些关于比率/密度的信息。我认为它太大了(800或480)。尝试设置inSampleSize=8我遇到了一个奇怪的情况,如果我尝试手动设置,SampleSize 3会使我的图像比我想要的大两倍,SampleSize 4会使图像变小……这不可能是真的。如果将inSampleSize设置为3,则结果图像的宽度/高度必须为原始图像的1/3
int tmpWidth = bitmapWidth;
int tmpHeight = bitmapHeigth;
int requiredSize = ...
while (true) {
if (tmpWidth / 2 < requiredSize
|| tmpHeight / 2 < requiredSize)
break;
tmpWidth /= 2;
tmpHeight /= 2;
ratio *= 2;
}