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

相关推荐
ha_lydms6 小时前
AnalyticDB分区、分布键性能优化
android·大数据·分布式·性能优化·分布式计算·分区·analyticdb
星辰6 小时前
Ijkplayer重新编译支持h264裸流
android
测试开发-学习笔记7 小时前
Android studio安装
android·ide·android studio
宋拾壹7 小时前
同时添加多个类目
android·开发语言·javascript
●VON8 小时前
AtomGit Flutter鸿蒙客户端:数据模型
android·服务器·安全·flutter·harmonyos·鸿蒙
火柴就是我8 小时前
记录一个文本随手指缩放的功能
android
Zender Han9 小时前
Android APK 签名 v1、v2、v3、v4 有什么区别?
android
神仙别闹9 小时前
基于 PHP + MySQL学生信息管理系统
android·mysql·php
墨狂之逸才10 小时前
Android 保活机制详解 —— 从概念到实践
android
故渊at10 小时前
第二板块:Android 四大组件标准化学理 | 第十二篇:四大组件全景总结与系统服务(System Server)架构
android·架构·wpf·四大组件·system service