您好我有这段代码:
编辑:
imageName = data.getData();
try{
InputStream stream = getContentResolver().openInputStream(imageName);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
bitmap = BitmapFactory.decodeStream(stream,null,options);
final int REQUIRED_WIDTH=(int)screenWidth;
final int REQUIRED_HIGHT=(int)screenHeight;
int scale=1;
while(options.outWidth/scale/2>=REQUIRED_WIDTH && options.outHeight/scale/2>=REQUIRED_HIGHT)
scale*=2;
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize=scale;
bitmap = BitmapFactory.decodeStream(stream, null, o2);
if ( bitmap != null ){
ok=true;
}
}catch(Exception e){
Toast.makeText(getBaseContext(),"error", Toast.LENGTH_SHORT).show();
}
但是位图仍为空
有人可以告诉我为什么吗?或更好......如何解决?
答案 0 :(得分:0)
您的getPathFromUri方法失败。它应该返回像/storage/emulated/0/DCIM/camera/bla bla.jpg
这样的东西。 file://
是权威,不是路径的一部分。 BitmapFactory正在寻找实际的文件位置路径。
您可以手动剥离或使用Uri类来执行此类操作:
Uri imgUri = Uri.parse(imgPath);
String filePath = imgUri.getPath();
答案 1 :(得分:0)
好的,所以如果我现在在编辑的帖子中这样做,我怎样才能“调整大小”图像以摆脱outOfMemory异常?
啊哈!现在我们到了某个地方。
在您之前编辑的问题中,您所拥有的是:
Bitmap
,由第三个字节数组支持这将导致您占用当前实现的堆空间大约2.1倍,这已经为您提供了OutOfMemoryError
个消息。上面#1和#3的字节数组大小相同,等于:
width x height x 4
其中宽度和高度以像素表示。
为减少内存消耗,您需要做的事情:
读取位图一次,就像您当前的代码一样。
使用BitmapFactory.Options
来控制位图的解码。特别是,use inSampleSize
可减少生成的Bitmap
中的像素数。引用inSampleSize
:
如果设置为值>如图1所示,请求解码器对原始图像进行二次采样,返回较小的图像以节省存储器。样本大小是任一维度中对应于解码位图中的单个像素的像素数。例如,inSampleSize == 4返回的图像是原始宽度/高度的1/4,像素数量的1/16。任何值< = 1都被视为1.注意:解码器使用基于2的幂的最终值,任何其他值将向下舍入到最接近的2的幂。
This sample project演示了inSampleSize
对各种硬编码值的使用。实际的Bitmap
加载来自:
private Bitmap load(String path, int inSampleSize) throws IOException {
BitmapFactory.Options opts=new BitmapFactory.Options();
opts.inSampleSize=inSampleSize;
return(BitmapFactory.decodeStream(assets().open(path), null, opts));
}