You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 10:15:30