Android开发使用Coil时如何获取Drawable的完整原始尺寸
问题背景
开发应用过程中需要获取Drawable的完整尺寸,原先使用Glide实现该逻辑的代码如下:
val bitmap = GlideApp .with(context) .asBitmap() .load(path) .submit() .get()
当前准备将图片加载库从Glide替换为Coil,初步替换后的代码如下:
val imageLoader = ImageLoader(context) val request = ImageRequest.Builder(context) .data(path) .build() val bitmap = imageLoader.execute(request).drawable?.toBitmap()
替换后出现尺寸获取异常:原始尺寸为4000x6000的图片,通过上述Coil代码加载后仅能得到1352x2028尺寸的位图,无法获取完整尺寸的位图。
问题原因
Coil默认会根据当前设备的屏幕参数、可用内存大小对加载的图片做自动采样缩放,避免加载过大位图触发OOM,默认配置下不会直接加载全尺寸原图,和Glide submit() 默认加载全尺寸的逻辑存在差异。
实现方案
构建ImageRequest时主动指定尺寸参数为OriginalSize,即可让Coil跳过自动采样逻辑,加载完整原始尺寸的位图,正确代码如下:
val imageLoader = ImageLoader(context) val request = ImageRequest.Builder(context) .data(path) // 核心配置:指定加载原始尺寸,不做缩放采样 .size(OriginalSize) // 可选配置:指定位图配置,避免默认配置修改原图色彩格式 .bitmapConfig(Bitmap.Config.ARGB_8888) .build() val fullSizeBitmap = imageLoader.execute(request).drawable?.toBitmap()
注意事项
- 全尺寸大图内存占用极高,以4000x6000的ARGB_8888格式位图为例,单张图片内存占用约为96MB,使用时需要做好内存兜底,避免触发OOM
- 如果仅需要获取图片的原始宽高、不需要将完整位图加载到内存,不需要走全图加载逻辑,可以直接通过
BitmapFactory.Options设置inJustDecodeBounds = true解析图片元数据拿尺寸,内存开销极低。
内容的提问来源于stack exchange,提问作者Ady
相关产品推荐
相关产品推荐

