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

相关推荐
黄林晴3 小时前
如何判断手机是否是纯血鸿蒙系统
android
火柴就是我3 小时前
flutter 之真手势冲突处理
android·flutter
法的空间4 小时前
Flutter JsonToDart 支持 JsonSchema
android·flutter·ios
循环不息优化不止4 小时前
深入解析安卓 Handle 机制
android
恋猫de小郭4 小时前
Android 将强制应用使用主题图标,你怎么看?
android·前端·flutter
jctech4 小时前
这才是2025年的插件化!ComboLite 2.0:为Compose开发者带来极致“爽”感
android·开源
用户2018792831674 小时前
为何Handler的postDelayed不适合精准定时任务?
android
叽哥4 小时前
Kotlin学习第 8 课:Kotlin 进阶特性:简化代码与提升效率
android·java·kotlin
Cui晨4 小时前
Android RecyclerView展示List<View> Adapter的数据源使用View
android
氦客4 小时前
Android Doze低电耗休眠模式 与 WorkManager
android·suspend·休眠模式·workmanager·doze·低功耗模式·state_doze