从网络加载一张大图片

作者: hahaoop | 来源:发表于2020-05-06 12:26 被阅读0次

我们首先获得目标View所需的大小,然后获得图片的大小,最后通过计算屏幕与图片的缩放比,按照缩放比来解析位图。

具体步骤如下:
1、将BitmapFactory.Options的inJustDecodeBounds参数设为true并加载图片
2、从BitmapFactory.Options中取出图片的原始宽高信息,他们对应于outWidth和outHeight参数
3、根据采样率的规律并结合目标View的所需大小计算出采样率inSampleSize
4、将BitmapFactory.Options的inJustDecodeBounds参数设为false,然后重新加载图片

两个方法比较重要,在这里我们进行解析:

options.inJustDecodeBounds:如果给它赋值true,那么它就不会解析图片。使用它的目的是为了获得图片的一些信息,如图片高度和宽度,然后进行下一步工作,也就是计算缩放比。将options.inJustDecodeBounds设置为false,将会加载图片

options.inSampleSize :给图片赋予缩放比,当它的值大于1的时候,它就会按照缩放比返回一个小图片用来节省内存。

除了因为图片大小自身的原因之外,还有Android对图片解码的因素在内:
在Android中使用ARGB来展示颜色的,一般情况下使用的是ARGB_8888,每个像素的大小约为4byte。如果对质量不做太大要求,可以使用ARGB_4444或者RGB_565,他们都是2个字节的。

如果图片涉及到放大功能,则也需要注意以下事项:

1.图片分块加载:

图片的分块加载在地图绘制的情况上最为明显,当想获取一张尺寸很大的图片的某一小块区域时,就用到了图片的分块加载,在Android中BitmapRegionDecoder类的功能就是加载一张图片的指定区域。BitmapRegionDecoder类的使用非常简单,API很少并且一目了然,如下:

(1)创建BitmapRegionDecoder实例
(2)获取图片宽高
(3)加载特定区域内的原始精度的Bitmap对象
(4)调用BitmapRegionDecoder类中的recycle(),回收释放Native层内存


20190421231916864.png

2.使用LruCache

继承并使用LruCache,利用其来缓存加载过的图片区域,需要重写一些方法,如sizeOf()、entryRemoved()等

其中sizeOf()用于处理获取缓存对象的大小,比如缓存Bitmap对象时,可以使用Bitmap的字节数作为Bitmap大小的表示。

entryRemoved()用于回收某个对象时调用,这样当回收Bitmap对象时可以调用Bitmap对象的recycle()方法主动释放Bitmap对象的内存。

3.手势处理:

主要用到两个手势处理类,分别是ScaleGestureDetector和GestureDetector,前者用于处理缩放手势,后者用于处理其余手势,如移动,快速滑动,点击,双击,长按等。

ScaleGestureDetector专门处理缩放手势,其比较重要的方法是onScale(ScaleGestureDetector detector),当缩放时会不停地回调这个方法,需要注意的一点是detector.getScaleFactor()获取到的缩放比例是相对上一次的

相关文章

  • 从网络加载一张大图片

    我们首先获得目标View所需的大小,然后获得图片的大小,最后通过计算屏幕与图片的缩放比,按照缩放比来解析位图。 具...

  • Swift控件--UIImageView、UISegmented

    UIImageView 从网络加载图片 从网络加载图片时,需要在项目的info.plist文件中添加一个App T...

  • React Native组件学习之Image

    Demo展示 上面是去加载网络图片,下面是加载本地图片 加载图片的几种方式 加载本地图片从项目中加载图片(一般是会...

  • 从OpenGL理解图片从文件渲染到屏幕的过程

    图片文件加载图片来源:网络、硬盘,存储在网络和磁盘里的各种格式的图片都是经过压缩之后的从网络或磁盘加载图片生成UI...

  • iOS SDWebImage 加载GIF图片没效果

    //加载本地GIF图片 //加载网络GIF图片 (SDWebImage 4.0 之前) //加载网络GIF图片(S...

  • Android自定义简单的图片加载器(ImageLoader)

    废话不多述,首先来说明下 为什么要用图片加载器 呢,就是为了避免图片重复从网络加载。也就是在第一次从网络加载之后就...

  • 微信小程序-image(图片)

    在微信小程序中,要显示一张图片,有两种图片加载方式: 加载本地图片 加载网络图片 加载本地图片 加载网络图片 微信...

  • Fresco 加载网络图片被裁剪

    遇到一个Fresco 从网络加载图片,被放大并剪裁掉了而显示不全。百思不得解。对比了本地图片的尺寸跟网络加载图片的...

  • iOS-SDWebImage

    网络图片加载框架:SDWebImage 支持从网络中下载且缓存图片,并设置图片到对应的 UIImageView 控...

  • flutter 图片

    加载网络图片网络图片 加载本地图片效果 实现图片圆角的几种方式 CircleAvatarCircleAvatar ...

网友评论

    本文标题:从网络加载一张大图片

    本文链接:https://www.haomeiwen.com/subject/zagightx.html