Android宽高不均等Bitmap缩放为指定宽高FitCenter到正方形Bitmap,Kotlin

Android宽高不均等Bitmap缩放为指定宽高FitCenter到正方形Bitmap,Kotlin

给定一个Bitmap,宽高不均等,把原Bitmap缩放成指定宽度的正方形Bitmap,相当于fit center缩放。提供两个方案:

Kotlin 复制代码
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.ImageDecoder
import android.graphics.RectF
import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.withContext
import androidx.core.graphics.scale
import androidx.core.graphics.toRect
import androidx.core.graphics.createBitmap


class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val image1 = findViewById<ImageView>(R.id.img1)
        val image2 = findViewById<ImageView>(R.id.img2)
        val image3 = findViewById<ImageView>(R.id.img3)
        val image4 = findViewById<ImageView>(R.id.img4)

        val src1 = ImageDecoder.createSource(this.resources, R.mipmap.high)
        val src2 = ImageDecoder.createSource(this.resources, R.mipmap.wide)

        lifecycleScope.async(Dispatchers.IO) {
            val bmp1 = ImageDecoder.decodeBitmap(src1)
            val bmp2 = ImageDecoder.decodeBitmap(src2)

            val bmp3 = bmp1.copy(Bitmap.Config.ARGB_8888, false)
            val bmp4 = bmp2.copy(Bitmap.Config.ARGB_8888, false)


            withContext(Dispatchers.Main) {
                image1.setImageBitmap(cropToFitCenter1(bmp1))
                image2.setImageBitmap(cropToFitCenter1(bmp2))

                image3.setImageBitmap(cropToFitCenter2(bmp3))
                image4.setImageBitmap(cropToFitCenter2(bmp4))
            }
        }
    }

    //方案1
    private fun cropToFitCenter1(bitmap: Bitmap, targetSize: Int = 400): Bitmap {
        var x: Int
        var y: Int

        var width: Int
        var height: Int

        val centerX = bitmap.width / 2
        val centerY = bitmap.height / 2

        var sz: Int
        if (bitmap.width > bitmap.height) {
            sz = bitmap.height

            x = centerX - sz / 2
            y = 0
        } else {
            sz = bitmap.width

            x = 0
            y = centerY - sz / 2
        }

        width = sz
        height = sz

        val bmp = Bitmap.createBitmap(bitmap, x, y, width, height)

        return bmp.scale(targetSize, targetSize)
    }

    //方案2(推荐)
    private fun cropToFitCenter2(srcBitmap: Bitmap, targetSize: Int = 400): Bitmap {
        val centerX = srcBitmap.width / 2f
        val centerY = srcBitmap.height / 2f
        val minSz = Math.min(srcBitmap.width, srcBitmap.height)

        val left = centerX - minSz / 2f
        val top = centerY - minSz / 2f
        val right = centerX + minSz / 2f
        val bottom = centerY + minSz / 2f

        val srcRectF = RectF(left, top, right, bottom)
        val dstRectF = RectF(0f, 0f, targetSize.toFloat(), targetSize.toFloat())

        val resultBmp = createBitmap(targetSize, targetSize)
        val canvas = Canvas(resultBmp)
        canvas.drawBitmap(srcBitmap, srcRectF.toRect(), dstRectF.toRect(), null)

        return resultBmp
    }
}

相关:

https://blog.csdn.net/zhangphil/article/details/134818221

https://blog.csdn.net/zhangphil/article/details/144219330

相关推荐
fundroid21 小时前
Room 3.0 完全解析:一次面向未来的现代化重构
android·数据库·database·kmp
漂洋过海来看你啊21 小时前
Jetpack Compose高效列表实战:状态管理与性能优化指南
android
张宏23621 小时前
android camera hal3-camera_module_t
android
hongtianzai1 天前
Laravel9.X核心特性全解析
android·java·数据库
七夜zippoe1 天前
Python 3.12+ 新特性深度解析:类型系统与性能革命
android·网络·python·类型系统·性能革命·3.12+
Kapaseker1 天前
五分钟搞定 Compose 的打字机效果
android·kotlin
彭波3961 天前
听歌软件下载!全网音乐随便听!手机电脑+电视端!音乐播放器推荐
android·智能手机·音频·开源软件·娱乐·软件需求
江澎涌1 天前
鸿蒙动态导入实战
android·typescript·harmonyos
lifewange1 天前
SQL中的聚合函数有哪些
android·数据库·sql
NPE~1 天前
[App逆向]环境搭建上篇——抓取apk https包
android·教程·逆向·android逆向·逆向分析