Android开发如何不缩放原图增大Bitmap尺寸
Android 扩展Bitmap高度实现方案
核心实现逻辑是创建目标尺寸的新位图,先填充指定背景色,再将原始位图绘制到对应位置即可,不需要依赖第三方库。

实现要点
- 新位图宽度与原图保持一致,高度可自定义传入,需保证不小于原图高度
- 新增区域支持任意自定义背景色,包括透明、黑色、白色
- 支持配置原始位图在新图中的对齐方式:顶部对齐、底部对齐、垂直居中
- 若需要透明背景,新位图的配置必须选择
Bitmap.Config.ARGB_8888,否则透明通道不生效
可复用实现代码(Kotlin)
import android.graphics.Bitmap import android.graphics.Canvas import android.graphics.Color import android.view.Gravity import kotlin.require /** * 扩展Bitmap高度,宽度保持与原图一致 * @param originalBitmap 输入的原始位图 * @param targetHeight 期望生成的新位图高度,必须大于等于原图高度 * @param bgColor 新增空白区域的填充色,默认透明 * @param originalGravity 原图在新位图中的垂直对齐方式,默认顶部对齐 */ fun expandBitmapHeight( originalBitmap: Bitmap, targetHeight: Int, bgColor: Int = Color.TRANSPARENT, originalGravity: Int = Gravity.TOP ): Bitmap { val originWidth = originalBitmap.width val originHeight = originalBitmap.height // 校验参数合法性 require(targetHeight >= originHeight) { "目标高度不可小于原始位图高度" } // 创建目标尺寸的新位图,ARGB_8888配置支持透明通道 val resultBitmap = Bitmap.createBitmap(originWidth, targetHeight, Bitmap.Config.ARGB_8888) val canvas = Canvas(resultBitmap) // 先填充整个画布的背景色 canvas.drawColor(bgColor) // 计算原图绘制的垂直偏移量 val drawOffsetY = when (originalGravity) { Gravity.TOP -> 0f Gravity.BOTTOM -> (targetHeight - originHeight).toFloat() Gravity.CENTER_VERTICAL -> (targetHeight - originHeight) / 2f else -> 0f } // 将原图绘制到指定位置 canvas.drawBitmap(originalBitmap, 0f, drawOffsetY, null) return resultBitmap }
调用示例
// 示例1:高度扩展为原图2倍,新增区域透明,原图顶部对齐 val transparentBmp = expandBitmapHeight( originalBitmap = sourceBmp, targetHeight = sourceBmp.height * 2, bgColor = Color.TRANSPARENT ) // 示例2:高度固定为1000px,新增区域白色,原图垂直居中 val whiteBgBmp = expandBitmapHeight( originalBitmap = sourceBmp, targetHeight = 1000, bgColor = Color.WHITE, originalGravity = Gravity.CENTER_VERTICAL ) // 示例3:高度固定为1200px,新增区域黑色,原图底部对齐 val blackBgBmp = expandBitmapHeight( originalBitmap = sourceBmp, targetHeight = 1200, bgColor = Color.BLACK, originalGravity = Gravity.BOTTOM )
注意事项
- 若不需要透明背景,可将新位图配置改为
Bitmap.Config.RGB_565,能减少约一半的内存占用,但该配置无Alpha通道,设置透明背景会显示为黑色 - 生成的新位图不再使用时,需及时调用
recycle()方法回收,避免Native内存泄漏 - 不建议直接在原始Bitmap上做修改,尽量保留原图副本,避免影响其他依赖原图的业务逻辑
内容的提问来源于stack exchange,提问作者Anael
相关产品推荐
相关产品推荐

