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

Android 如何将MultiBodyPart.Part转换为图片Uri或Bitmap以在ImageView展示

实现方案

方案1(推荐):复用原始图片路径加载

你生成MultipartBody.Part时必然是基于本地图片的文件路径/Uri转换得到,直接用原始路径加载到ImageView即可,不需要从Part中读取数据,性能最优且不会出现额外的内存消耗。
可以直接用Glide、Coil等图片加载框架加载,示例代码:

// Coil 示例
imageView.load(本地图片Uri/文件路径)

// Glide 示例
Glide.with(context).load(本地图片Uri/文件路径).into(imageView)

方案2:仅保留了MultipartBody.Part对象,无原始路径

需要先读取Part内部封装的二进制流,转换为Bitmap后设置到ImageView,注意流读取操作必须在子线程执行,避免阻塞主线程导致ANR。

操作步骤:

  • 从Part中获取RequestBody对象:val requestBody = part.body()
  • 子线程读取输入流并解码为Bitmap,切回主线程设置ImageView

Kotlin 示例(协程实现):

lifecycleScope.launch(Dispatchers.IO) {
    runCatching {
        val inputStream = requestBody.byteStream()
        // 可添加Bitmap采样压缩逻辑避免OOM
        val bitmap = BitmapFactory.decodeStream(inputStream)
        inputStream.close()
        bitmap
    }.onSuccess { bitmap ->
        withContext(Dispatchers.Main) {
            imageView.setImageBitmap(bitmap)
        }
    }.onFailure {
        // 处理加载失败逻辑
        it.printStackTrace()
    }
}

Java 示例:

new Thread(() -> {
    try {
        InputStream inputStream = part.body().byteStream();
        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
        // 切回主线程设置
        runOnUiThread(() -> imageView.setImageBitmap(bitmap));
        inputStream.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}).start();

注意:如果图片尺寸较大,直接解码全量Bitmap可能触发OOM,建议解码时添加inSampleSize采样参数压缩,或者先把流写入本地临时文件再通过图片加载框架加载,降低内存占用。

内容的提问来源于stack exchange,提问作者dennisrufigill

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:15:01