Android BitmapShader简洁实现马赛克,Kotlin(一)

Android BitmapShader简洁实现马赛克,Kotlin(一)

这一篇,

Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3)-CSDN博客

基于PorterDuffXfermode实现马赛克,理解上有一定难度。

这次,基于BitmapShader简洁实现马赛克。

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    tools:context=".MainActivity">

    <com.myapp.MyView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
Kotlin 复制代码
import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.BitmapShader
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.Path
import android.graphics.Shader
import android.graphics.drawable.BitmapDrawable
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatImageView


class MyView : AppCompatImageView {
    private var mPaint: Paint = Paint()
    private var mPath: Path = Path()

    private var mPreX = 0f
    private var mPreY = 0f
    private var mBitmapShader: BitmapShader? = null

    private val mResId = R.mipmap.npl

    private var mMosaicScaleFactor = 16f //值越大,马赛克效果越强。

    private var mSrcBmp: Bitmap? = null

    private var mSrcBmpW = 0
    private var mSrcBmpH = 0

    constructor(ctx: Context, attributeSet: AttributeSet) : super(ctx, attributeSet) {
        mPaint.style = Paint.Style.STROKE
        mPaint.strokeWidth = 35f

        mSrcBmp = BitmapFactory.decodeResource(resources, mResId, null)
        background = BitmapDrawable(resources, mSrcBmp)

        mSrcBmpW = mSrcBmp!!.width
        mSrcBmpH = mSrcBmp!!.height

        val mosaicBmp = getMosaicBmp(mSrcBmp!!)
        mBitmapShader = BitmapShader(mosaicBmp, Shader.TileMode.CLAMP, Shader.TileMode.REPEAT)

        mPaint.setShader(mBitmapShader)
    }

    override fun onDraw(canvas: Canvas) {
        super.onDraw(canvas)

        canvas.drawPath(mPath, mPaint)
    }

    override fun onTouchEvent(event: MotionEvent): Boolean {
        when (event.action) {
            MotionEvent.ACTION_DOWN -> {
                mPath.moveTo(event.x, event.y)
                mPreX = event.x
                mPreY = event.y

                return true
            }

            MotionEvent.ACTION_MOVE -> {
                val endX = (mPreX + event.x) / 2
                val endY = (mPreY + event.y) / 2
                mPath.quadTo(mPreX, mPreY, endX, endY)

                mPreX = event.x
                mPreY = event.y
            }

            MotionEvent.ACTION_UP -> {

            }
        }

        postInvalidate()

        return super.onTouchEvent(event)
    }

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

        val c = Canvas(dstBmp)
        val mtx = Matrix()
        mtx.setScale(1 / mMosaicScaleFactor, 1 / mMosaicScaleFactor)
        c.drawBitmap(srcBmp, mtx, null)

        return dstBmp
    }

    private fun getMosaicBmp(srcBmp: Bitmap): Bitmap {
        val smallBmp = getSmallBmp(srcBmp)

        //空Bitmap
        val dstBmp = Bitmap.createBitmap(mSrcBmpW, mSrcBmpH, Bitmap.Config.ARGB_8888)

        val mtx = Matrix()
        mtx.setScale(mMosaicScaleFactor, mMosaicScaleFactor)

        val c = Canvas(dstBmp)
        c.drawBitmap(smallBmp, mtx, null)

        return dstBmp
    }
}

当手指在图上划过时,划过的轨迹马赛克:

Android BitmapShader更简易的实现刮刮乐功能,Kotlin_kotlin shaderbrush-CSDN博客文章浏览阅读816次,点赞8次,收藏19次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android Bitmap保存成至手机图片文件,Kotlin_android bitmap保存图片-CSDN博客。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。_kotlin shaderbrushhttps://blog.csdn.net/zhangphil/article/details/145143789https://blog.csdn.net/zhangphil/article/details/145143789https://blog.csdn.net/zhangphil/article/details/145143789

Android简洁缩放Matrix实现图像马赛克,Kotlin_kotlin matrix-CSDN博客文章浏览阅读916次,点赞5次,收藏12次。以图形图像界经典的实验例图Lenna为例,当手指在图片上滑过后,形成马赛克的: 写一个MosaicView继承自AppCompatImageView:package com.zhangphil;原理,通过Matrix把一个原图缩小到原先的1/n,然后再把缩小后的小图放大n倍,自然就是马赛克效果(相当于是放大后像素"糊"成一片了)。Android图形图像处理:马赛克(Mosaic)效果_android对图片部分区域做马赛克-CSDN博客。_kotlin matrixhttps://blog.csdn.net/zhangphil/article/details/144559418https://blog.csdn.net/zhangphil/article/details/144559418https://blog.csdn.net/zhangphil/article/details/144559418

相关推荐
野生的码农8 小时前
码农的妇产科实习记录
android·java·人工智能
王正南8 小时前
kali-linux 虚拟机连接安卓模拟器
android·linux·运维·虚拟机连接模拟器·安卓模拟器,linux虚拟机
撩得Android一次心动9 小时前
Android Jetpack 概述
android·android jetpack
JinBeen9 小时前
sourcetree下码云gitee的ssh经常失效问题
android·gitee·ssh
帅得不敢出门9 小时前
Android各芯片平台日志打开及获取
android
极客小云9 小时前
【Android Gradle 构建常见报错及解决方法大全】
android·运维开发
Just_Paranoid10 小时前
【TaskbarDelegate】屏蔽上滑返回桌面手势功能
android·systemui·navigation·launcher·gesture
赛恩斯10 小时前
asfp 如何导入并使用aosp13
android
诸神黄昏EX11 小时前
Android Safety 系列专题【篇三:Secure Boot机制】
android
李坤林11 小时前
Android Binder 详解(4) Binder 线程池
android·java·binder