可以读取较大的图片而不会内存溢出了

在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去 BitmapFactory.Options类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。

  然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止 100K?

  经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的

  If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.

  意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和 outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize 可能小于0,必须做判断。
具体代码如下:
FrameLayout fr=(FrameLayout)findViewById(R.id.FrameLayout01);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
// 获取这个图片的宽和高
Bitmap bitmap = BitmapFactory.decodeFile("/sdcard/test.jpg", options); //此时的bitmap为null
options.inJustDecodeBounds = false;
//计算缩放比
int be = (int)(options.outHeight / (float)200);
if (be <= 0)
be = 1;
options.inSampleSize = be;
//重新读入图片,注意这次要把options.inJustDecodeBounds 设为 false
bitmap=BitmapFactory.decodeFile("/sdcard/test.jpg",options); //此时的bitmap不为null
ImageView imageView=new ImageView(this);
imageView.setImageBitmap(bitmap);

这样我们就可以读取较大的图片而不会内存溢出了。如果你想把压缩后的图片保存在Sdcard上的话就很简单了:
File file=new File("/sdcard/feng.png");
try {
FileOutputStream out=new FileOutputStream(file);
if(bitmap.compress(Bitmap.CompressFormat.PNG, 100, out)){
out.flush();
out.close();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ok,这样就把图片保存在/sdcard/feng.png这个文件里面了,

***********************************************************************************

转自http://www.cnblogs.com/RayLee/archive/2010/11/09/1872856.html

BitmapFactory.decodeFile(imageFile);

用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。

 

另外,可以通过Bitmap.recycle()方法来释放位图所占的空间,当然前提是位图没有被使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用POI读取Excel文件时,如果遇到大量的空行,可能会导致内存溢出的问题。这是因为POI在读取Excel文件时会将整个文件的内容全部加载到内存中,而空行并没有实际的数据内容,但仍然会占用内存空间。 解决这个问题的方法有以下几种: 1. 使用逐行读取的方式:通过POI提供的API,可以逐行读取Excel文件的内容,而不是将整个文件加载到内存中。这样可以有效地避免空行占用过多的内存空间。 2. 添加筛选条件:在读取Excel文件时,可以添加筛选条件,只读取有效的数据行,而忽略空行。可以通过判断某一行是否为空行的方式,进行过滤。 3. 设置最大行数限制:可以设置最大行数的限制,当达到设定的最大行数时,停止继续读取Excel文件。这样可以避免读取过多的空行,从而减少内存占用。 4. 对大文件进行分块处理:如果Excel文件太大,无法完全加载到内存中,可以将文件进行分块处理,每次读取一部分内容,然后进行处理,这样可以避免一次性读取整个文件导致内存溢出。 需要注意的是,以上方法仅仅是针对空行导致的内存溢出问题,如果Excel文件本身非常大,仍然可能会出现内存溢出的情况。为了避免此类问题,可以考虑采取其他的解决方案,例如使用数据库进行存储和查询,或者使用分布式处理来处理大规模的数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值