Android Jetpack Compose中奖两张图片合并成一张 Bitmap

谢谢关注!!

前言:华为开发学习专栏。如需了解谢谢查阅: http://t.csdnimg.cn/01PQ2

一、直接上代码

1、可裁剪:cropBitmapCenter

2、根据 left、top参数设置覆盖在上面的 bitmap的位置:

left = 15

top = 8

Kotlin 复制代码
@Composable
fun MergeImageToBitmap(type: Int, imageResOne: Int, imageResTwo: Int) :Bitmap{
    // 获取上下文
    val context = LocalContext.current

    // 等待图片加载完成
    val bitmap1 = BitmapFactory.decodeResource(context.resources, imageResOne)
    val bitmap2 = BitmapFactory.decodeResource(context.resources, imageResTwo)
    var left = 15
    var top = 8
    var croppedBitmap = cropBitmapCenter(bitmap1, (bitmap2.width / 6) * 4, bitmap2.height - 20)
    var croppedBitmap2 = cropBitmapCenter(bitmap2, (bitmap2.width / 7) * 5, bitmap2.height)
    when (type) {
        0 -> {
             left = 15
             top = 8
            croppedBitmap = cropBitmapCenter(bitmap1, (bitmap2.width / 6) * 4, bitmap2.height - 20)
            croppedBitmap2 = cropBitmapCenter(bitmap2, (bitmap2.width / 7) * 5, bitmap2.height)
        }

        1 -> {
             left = 60
             top = 60
            croppedBitmap = cropBitmapCenter(bitmap1, (bitmap2.width /7) * 4, (bitmap2.width / 7) *4)
            croppedBitmap2 = cropBitmapCenter(bitmap2, (bitmap2.width / 5) * 4, (bitmap2.width / 5) * 4)
        }

        2 -> {
            left = 30
            top = 23
            croppedBitmap = cropBitmapCenter(bitmap1, (bitmap2.width)-60 , ((bitmap2.height/7) * 4)-15)
            croppedBitmap2 = cropBitmapCenter(bitmap2, (bitmap2.width) , (bitmap2.height/ 6) * 4)
        }
    }


    // 确保两个 Bitmap 有相同的宽度和高度,或者根据需要调整
    val width = maxOf(bitmap1.width, bitmap2.width)
    val height = maxOf(bitmap1.height, bitmap2.height)

    // 创建一个新的 Bitmap 来容纳合并后的图像
    val mergedBitmap = Bitmap.createBitmap(bitmap2.width, bitmap2.height, Bitmap.Config.ARGB_8888)

    // 使用 Canvas 将两个 Bitmap 绘制到合并的 Bitmap 上
    Canvas(mergedBitmap).apply {
        drawBitmap(croppedBitmap, left.toFloat(), top.toFloat(), null)
        drawBitmap(croppedBitmap2, 0f, 0f, null) // 在第一个图像下方绘制第二个图像
    }

//    val viewModel = viewModel<BaseViewMode>(factory = MyViewModelFactory)
//    viewModel.setBitmap(mergedBitmap)
   return mergedBitmap
}

@Composable
fun cropBitmapCenter(bitmap: Bitmap, desiredWidth: Int, desiredHeight: Int): Bitmap {
    // 计算原始Bitmap的中心点
    val centerX = bitmap.width / 2
    val centerY = bitmap.height / 2
    // 计算裁剪区域的左上角坐标
    val left = centerX - desiredWidth / 2
    val top = centerY - desiredHeight / 2
    // 创建裁剪区域
    val cropRect = Rect(left, top, left + desiredWidth, top + desiredHeight)
    // 创建一个新的Bitmap对象,用于存放裁剪后的图像
    val croppedBitmap = Bitmap.createBitmap(desiredWidth, desiredHeight, bitmap.config)
    // 开始裁剪
    val canvas = Canvas(croppedBitmap)
    canvas.drawBitmap(bitmap, cropRect, Rect(0, 0, desiredWidth, desiredHeight), null)
    // 返回裁剪后的Bitmap
    return croppedBitmap
}
HarmonyOs开发更新中:http://t.csdnimg.cn/vVSkV

谢谢阅读,烦请关注:

后续将持续更新!!

相关推荐
安卓开发者8 小时前
Android RxJava 组合操作符实战:优雅处理多数据源
android·rxjava
阿华的代码王国8 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼8 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jerry说前后端8 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化
alexhilton9 小时前
深入浅出着色器:极坐标系与炫酷环形进度条
android·kotlin·android jetpack
一条上岸小咸鱼15 小时前
Kotlin 基本数据类型(一):Numbers
android·前端·kotlin
Huntto15 小时前
最小二乘法计算触摸事件速度
android·最小二乘法·触摸事件·速度估计
一笑的小酒馆15 小时前
Android中使用Compose实现各种样式Dialog
android
红橙Darren16 小时前
手写操作系统 - 编译链接与运行
android·ios·客户端
鹏多多.19 小时前
flutter-使用device_info_plus获取手机设备信息完整指南
android·前端·flutter·ios·数据分析·前端框架