Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Android createScaledBitmap与Canvas通过RectF drawBitmap生成马赛克/高斯模糊(毛玻璃)对比,Kotlin

Kotlin 复制代码
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.RectF
import android.os.Bundle
import android.widget.ImageView
import androidx.appcompat.app.AppCompatActivity
import androidx.core.graphics.toRect

class MainActivity : AppCompatActivity() {
    private var mScaleFactor = 16f //值越大,马赛克效果越强。
    private var mSrcBmp: Bitmap? = null
    private val mResId = R.mipmap.pic
    private var mSrcBmpW = 0
    private var mSrcBmpH = 0

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val image1 = findViewById<ImageView>(R.id.image1)
        val image2 = findViewById<ImageView>(R.id.image2)

        mSrcBmp = BitmapFactory.decodeResource(resources, mResId, null)
        mSrcBmpW = mSrcBmp!!.width
        mSrcBmpH = mSrcBmp!!.height

        val smallBmp = getSmallBmp(mSrcBmp!!)

        image1.setImageBitmap(Bitmap.createScaledBitmap(smallBmp, mSrcBmpW, mSrcBmpH, true))
        image2.setImageBitmap(getScaleBmp(smallBmp))
    }

    private fun getSmallBmp(srcBmp: Bitmap): Bitmap {
        return Bitmap.createScaledBitmap(srcBmp, (mSrcBmpW / mScaleFactor).toInt(), (mSrcBmpH / mScaleFactor).toInt(), true)
    }

    private fun getScaleBmp(srcBmp: Bitmap): Bitmap {
        //空Bitmap
        val dstBmp = Bitmap.createBitmap(mSrcBmpW, mSrcBmpH, Bitmap.Config.ARGB_8888)

        val srcRectF = RectF(0f, 0f, srcBmp.width.toFloat(), srcBmp.height.toFloat())
        val dstRectF = RectF(0f, 0f, mSrcBmpW.toFloat(), mSrcBmpH.toFloat())

        val c = Canvas(dstBmp)
        c.drawBitmap(srcBmp, srcRectF.toRect(), dstRectF.toRect(), null)

        return dstBmp
    }
}

自上往下,第一张是原图,第二张是通过

java 复制代码
    public static Bitmap createScaledBitmap(@NonNull Bitmap src, int dstWidth, int dstHeight,
            boolean filter)

先把原图缩小1/n,然后再放大到原图等同大小,实现马赛克,发现这种方式生成的Bitmap,肯定可以达到马赛克效果,并基本接近高斯模糊效果。

第三张图是通过Canvas的

java 复制代码
    public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst,
            @Nullable Paint paint)

基于RectF放大小图到原图大小,发现马赛克的颗粒度更大,更具备马赛克典型特征。

总结起来,

java 复制代码
    public static Bitmap createScaledBitmap(@NonNull Bitmap src, int dstWidth, int dstHeight,
            boolean filter)

生成的图更平滑。

这种方式生成的图:

java 复制代码
    public void drawBitmap(@NonNull Bitmap bitmap, @Nullable Rect src, @NonNull Rect dst,
            @Nullable Paint paint) 

尤其是放大情况下,拉伸的跨越明显,更具大颗粒度的马赛克效果。

Android BitmapShader简洁实现马赛克/高斯模糊(毛玻璃),Kotlin(三)-CSDN博客文章浏览阅读753次,点赞5次,收藏10次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android BitmapShader简洁实现马赛克,Kotlin(一)-CSDN博客。https://zhangphil.blog.csdn.net/article/details/145322436

相关推荐
我不会插花弄玉4 小时前
7.函数【由浅入深-MySQL】
android·数据库·mysql
vilya5 小时前
手机端 Agent 怎么动起来:Kotlin 与 Python 之间的桥
android·agent
高晶5 小时前
Android 新手实战:从零搭建 WebRTC 在线直播系统
android·程序员
alexhilton5 小时前
为什么你的 LazyColumn 仍然卡顿
android·kotlin·android jetpack
>Andre<6 小时前
系统架构全景
android
hai_android10 小时前
Android 嵌套滑动冲突:内部拦截 vs 外部拦截实战
android·android studio·android jetpack
木子欢儿12 小时前
Zabbix 7.4 Alpine 版 Docker Compose 部署
android·运维·docker·容器·zabbix
素师良码13 小时前
第9篇:Android驱动踩坑实录:DSI RX FIFO前置脏0、数据错位复盘
android
夜雪一千13 小时前
如何在MySQL中实现字段级加密
android·数据库·mysql
夜雪一千13 小时前
MySQL 如何存储经纬度坐标:选型、建表、空间查询实战
android·mysql·adb