Kotlin开发中Fragment内如何实现Bitmap到File的转换?
Kotlin Android 开发中 Bitmap 转 File 实现方案
你当前通过相机回调extras.get("data")获取到的是相机返回的缩略图Bitmap,要转成可供接口上传的File,可按以下思路实现:
- 优先选择应用私有目录作为文件存储位置,无需额外申请存储权限,减少权限适配成本
- 通过流写入的方式将Bitmap压缩写入目标文件,可根据业务需求调整压缩格式、质量参数
- 转换完成后及时回收无用Bitmap,避免不必要的内存占用
核心转换代码
可以把转换逻辑封装成Bitmap的扩展函数,复用性更高:
import android.graphics.Bitmap import java.io.File import java.io.FileOutputStream fun Bitmap.toFile( targetFile: File, compressFormat: Bitmap.CompressFormat = Bitmap.CompressFormat.JPEG, quality: Int = 90, recycleBitmap: Boolean = true ): File { FileOutputStream(targetFile).use { fos -> compress(compressFormat, quality, fos) fos.flush() } if (recycleBitmap && !isRecycled) { recycle() } return targetFile }
回调中使用示例
修改你原来的相机结果回调代码,在拿到Bitmap后调用转换方法即可得到可上传的File对象:
private val cameraResult = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> if (result.resultCode == Activity.RESULT_OK && result.data != null) { val bitmap = result.data?.extras?.get("data") as Bitmap binding.ivProfile.loadImage(bitmap) // 创建私有目录下的临时图片文件 val uploadImgFile = File( requireContext().getExternalFilesDir(android.os.Environment.DIRECTORY_PICTURES), "avatar_upload_${System.currentTimeMillis()}.jpg" ) // 转换得到可上传的File val targetUploadFile = bitmap.toFile(uploadImgFile) // 此处即可将targetUploadFile传入上传接口 } }
优化提示
注意:上述方式拿到的是相机返回的低分辨率缩略图,画质损失较大,仅适合头像等对清晰度要求不高的场景。如果需要上传高清原图,不建议通过返回的Bitmap转换实现,正确做法是发起拍照请求前提前创建好存储原图的File,通过FileProvider将File对应的Uri传入相机Intent的
MediaStore.EXTRA_OUTPUT参数,相机会直接把高清原图写入指定File,无需额外转换,也能避免大Bitmap导致的OOM问题。
内容的提问来源于stack exchange,提问作者uul
相关产品推荐
相关产品推荐

