面试官说分片显示加载100M的图片撑不爆内存 我笑了

还记得当年面试一个面试官问我怎么加载巨图才能不撑爆内存,我没回答上来,他说分片显示,我寻思特么分片能减少内存使用??现在可以打他脸了!

内容扩展

1.图片的三级缓存中,图片加载到内存中,如果内存快爆了,会发生什么?怎么处理?
2.内存中如果加载一张 500*500 的 png 高清图片.应该是占用多少的内存?
3.Bitmap 如何处理大图,如一张 30M 的大图,如何预防 OOM?

Android开发中,有时候会有加载巨图的需求,如何加载一个大图而不产生OOM呢,使用系统提供的BitmapRegionDecoder这个类可以很轻松的完成。

效果图:

BitmapRegionDecoder:区域解码器,可以用来解码一个矩形区域的图像,有了这个我们就可以自定义一块矩形的区域,然后根据手势来移动矩形区域的位置就能慢慢看到整张图片了。

OK 核心原理就是这么简单,不过做起来还是有一些细节处理,下面就一步一步的完成一个加载大图,支持拖动查看,双击放大,手势缩放的的自定义View。

第一步,初始化变量
  private void init(){
    mOptions = new BitmapFactory.Options();
    //滑动器
    mScroller = new Scroller(getContext());
    //所放器
    mMatrix = new Matrix();
    //手势识别
    mGestureDetector = new GestureDetector(getContext(),this);
    mScaleGestureDetector = new ScaleGestureDetector(getContext(),this);
}

BitmapFactory.Options我们很熟悉,用来配置Bitmap相关的参数,比如获取Bitmap的宽高,内存复用等参数。

GestureDetector用来识别双击事件,ScaleGestureDetector用来监听手指的缩放事件,都是系统提供的类,比较方便使用。

第二步,设置需要加载的图片
  public void setImage(InputStream is){
      mOptions.inJustDecodeBounds = true;
      BitmapFactory.decodeStr
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、这个软件使用C#编写,需要.NET Framework 4.0运行环境。 2、建议“新建文件夹”来保存分割后的图片,因为程序会自动清空该文件夹下所有文件。 3、这个软件可以对图片进行,行与列的分割。如果大家按块对图片进行行分割,那么分割列数填写1,分割行书填写自己要分割的行;如果大家按块数想对列分割,那么分割列数填写要分割的列数,分割行数填写1。如果大家按像素对图片进行横向切割,那么像素宽度填写1,高度随便写;如果按像素对图片进行纵向切割,那么像素高度填写1,像素宽度随便写。 4、分割图片的耗时跟图片大小、切割块数的多少有直接关系。另外,图片在切割的时候无论何种切割方式都是将图片读取到内存中进行切割,所以注意一下自己机器内存的大小,以及图片的大小。以免内存报错。 5、从网上直接加载图片时候,图片类型只能为jpg或者png格式,其他类型的图片暂不支持。另外,在输入时一定要输入“http://”或"https://",输入完毕后按回车键。 6、图片九宫格合并,主要在文件的命名上,文件名以数字开头,类似于“0_0.jpg”这样的文件名,其中第一个0代表行,第二个0代表列,0_0这样的文件名是指第一行,第一张图片,0_1是指第一行,第二张图片,0_2是指第一行,第三张图片以此类推。具体看文章上方关于九宫格的图片明。 7、由于程序在编译的时候使用了代码保护软件进行保护,所以在运行的时候360之类的软件会有报警,如果大家很在意360之类的报警提示的话。那就绕行吧。。。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值