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

Android中如何将相机捕获的图片正确转换为原尺寸Bitmap?

解决BitmapFactory.decodeByteArray导致图片分辨率降低的问题

嘿,这个问题我之前在项目里也碰到过!核心原因是BitmapFactory默认会根据设备的屏幕密度(density)自动缩放图片,你的原始1440x1080图片就是被这个默认机制压缩成了1080x720。下面给你几个简单有效的解决方案:

方案一:直接禁用自动缩放

这是最直接的办法,通过设置BitmapFactory.Options的inScaled为false,强制BitmapFactory不做任何缩放处理,完全保留图片的原始分辨率。

代码示例:

val options = BitmapFactory.Options().apply {
    inScaled = false // 关闭自动缩放逻辑
}
// 注意:把bytes.lastIndex改成bytes.size,因为第三个参数是要解码的字节总数
val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options)

方案二:手动匹配密度(适合需要密度适配的场景)

如果你后续需要考虑图片在不同密度设备上的显示效果,可以手动让目标密度和图片原始密度保持一致,这样也不会触发缩放:

// 第一步:先获取图片的原始信息(不加载Bitmap,性能开销小)
val options = BitmapFactory.Options().apply {
    inJustDecodeBounds = true
}
BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options)

// 第二步:设置密度参数,让目标密度和原始密度一致
options.apply {
    inJustDecodeBounds = false // 允许加载Bitmap
    inDensity = outDensity // 图片的原始密度
    inTargetDensity = outDensity // 目标密度和原始密度相同,避免缩放
}

val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options)

另外提醒你一下:你原来代码里用bytes.lastIndex作为解码长度是有问题的——decodeByteArray的第三个参数是要解码的字节总数,而bytes.lastIndex等于数组长度减1,这会导致少解码一个字节,可能引发图片加载不完整甚至崩溃,一定要改成bytes.size哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:52:39