当前位置: 首页 > news >正文

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

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

import android.content.Context
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import android.graphics.Path
import android.graphics.PorterDuff
import android.graphics.PorterDuffXfermode
import android.util.AttributeSet
import android.view.MotionEvent
import androidx.appcompat.widget.AppCompatImageViewclass MyView : AppCompatImageView {private var WIDTH = 0private var HEIGHT = 0private var mPaint: Paint = Paint()private var mBmpMosaic: Bitmapprivate var mBmpDst: Bitmapprivate var mBmpSrc: Bitmapprivate var mPath: Pathprivate var mPreX = 0fprivate var mPreY = 0fprivate var mPorterDuffXfermode: PorterDuffXfermodeprivate val mResId = R.mipmap.pprivate val mScaleFator = 20fconstructor(ctx: Context, attributeSet: AttributeSet) : super(ctx, attributeSet) {mPaint.style = Paint.Style.STROKEmPaint.strokeWidth = 30f//和一张原图大小相同的马赛克图mBmpMosaic = getMosaicBmp()//原图。mBmpSrc = BitmapFactory.decodeResource(resources, mResId, null)WIDTH = mBmpSrc.widthHEIGHT = mBmpSrc.height//空的BitmapmBmpDst = Bitmap.createBitmap(WIDTH, HEIGHT, Bitmap.Config.ARGB_8888)mPath = Path()/**** SRC_OUT** 当目标图像有图像时合成结果为空白像素;* 当目标图像没有图像时,合成结果显示源图像;* 如果把手指Path做为目标图像,在与源图像合成时,有手指轨迹的地方就变为空白像素,效果就是擦除。**/mPorterDuffXfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_OUT)}override fun onDraw(canvas: Canvas) {//super.onDraw(canvas)//第一层,一张固定的马赛克底图。canvas.drawBitmap(mBmpMosaic, 0f, 0f, null)val layerId = canvas.saveLayer(0f, 0f, WIDTH.toFloat(), HEIGHT.toFloat(), null)//第二层,原图。canvas.drawBitmap(mBmpSrc, 0f, 0f, null)//第三层,绘制空的目标图像,和原图大小一致canvas.drawBitmap(mBmpDst, 0f, 0f, null)//合成图像mPaint.setXfermode(mPorterDuffXfermode)//空的mBmpDst绘制Pathcanvas.drawPath(mPath, mPaint) //擦除第二层的原图,使得第一层的马赛克底图露出来。mPaint.setXfermode(null)canvas.restoreToCount(layerId)}override fun onTouchEvent(event: MotionEvent): Boolean {when (event.action) {MotionEvent.ACTION_DOWN -> {mPath.moveTo(event.x, event.y)mPreX = event.xmPreY = event.yreturn true}MotionEvent.ACTION_MOVE -> {val endX = (mPreX + event.x) / 2val endY = (mPreY + event.y) / 2mPath.quadTo(mPreX, mPreY, endX, endY)mPreX = event.xmPreY = event.y}MotionEvent.ACTION_UP -> {}}postInvalidate()return super.onTouchEvent(event)}private fun getMosaicBmp(): Bitmap {val bmpSrc = BitmapFactory.decodeResource(resources, mResId, null)val w = bmpSrc.widthval h = bmpSrc.height//原Bitmap的1/mScaleFatorval smallBmp = Bitmap.createBitmap((w / mScaleFator).toInt(), (h / mScaleFator).toInt(), Bitmap.Config.ARGB_8888)val cDst = Canvas(smallBmp)val mtx = Matrix()mtx.setScale(1 / mScaleFator, 1 / mScaleFator)cDst.drawBitmap(bmpSrc, mtx, null)mtx.reset()val resultBmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888)val canvas = Canvas(resultBmp)mtx.setScale(mScaleFator, mScaleFator)canvas.drawBitmap(smallBmp, mtx, null)//此时的resultBmp为原图大小的马赛克图。return resultBmp}
}

当手指在图像上划过后,划过的轨迹变成马赛克。

Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现“刮刮乐”效果,Kotlin(2)-CSDN博客文章浏览阅读589次,点赞21次,收藏12次。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。Android Bitmap保存成至手机图片文件,Kotlin_android bitmap保存图片-CSDN博客。Android拼接合并图片生成长图代码实现合并两张图片,以第一张图片的宽度为标准,如果被合并的第二张图片宽度和第一张不同,那么就以第一张图片的宽度为准线,对第二张图片进行缩放。https://blog.csdn.net/zhangphil/article/details/144536192


http://www.mrgr.cn/news/81558.html

相关文章:

  • 【代码随想录day58】【C++复健】 117. 软件构建(拓扑排序);47. 参加科学大会(dijkstra(朴素版)精讲)
  • 【物联网技术与应用】实验15:电位器传感器实验
  • 【C++】异步(并发)实现 线程池 ---附源码+实现步骤(future、async、promise、package_task、任务池原理和框架)
  • 05.HTTPS的实现原理-HTTPS的握手流程(TLS1.2)
  • 汽车免拆诊断案例 | 2011 款奔驰 S400L HYBRID 车发动机故障灯异常点亮
  • css 编写注意-1-命名约定
  • 代码随想录算法【Day2】
  • SpeedTree学习笔记总结
  • 概率论期末速成笔记(包过版)
  • k8s网络,跨主机容器通信机制(没看懂)
  • GitLab安装及使用
  • Llama 3 简介(一)
  • NVIDIA vGPU虚拟机显卡分片技术
  • uni-app 跨端开发精美开源UI框架推荐
  • 汇总贴:cocos creator
  • Python + 深度学习从 0 到 1(02 / 99)
  • 服务平滑发布与线上验证
  • 秒鲨后端之MyBatis【1】环境的搭建和核心配置文件详解
  • tslib(触摸屏输入设备的轻量级库)的学习、编译及测试记录
  • 增强路由器 路由器升级宽带速度
  • Text2Reward学习笔记
  • 【强化学习】Stable-Baselines3学习笔记
  • Linux系统下安装webstorm
  • 华为管理变革之道:管理制度创新
  • 19、vue3组件通信
  • Java抽象工厂+单例模式