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 分钟前
App渠道来源追踪方案全面分析(iOS/Android/鸿蒙)
android·ios·harmonyos
wk灬丨1 小时前
Android Kotlin Flow 冷流 热流
android·kotlin·flow
千雅爸爸1 小时前
Android MVVM demo(使用DataBinding,LiveData,Fresco,RecyclerView,Room,ViewModel 完成)
android
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
孤客网络科技工作室2 小时前
AJAX 全面教程:从基础到高级
android·ajax·okhttp
Mr Lee_3 小时前
android 配置鼠标右键快捷对apk进行反编译
android
顾北川_野4 小时前
Android CALL关于电话音频和紧急电话设置和获取
android·音视频
&岁月不待人&4 小时前
Kotlin by lazy和lateinit的使用及区别
android·开发语言·kotlin
Winston Wood6 小时前
Android Parcelable和Serializable的区别与联系
android·序列化
清风徐来辽6 小时前
Android 项目模型配置管理
android