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
相关产品推荐
相关产品推荐

