Glide 加载图片并应用滤镜效果

https://chatgpt.com/share/675a5bf6-7cd8-8003-98e7-d86146e47e95

常用滤镜类型

  1. 颜色调整滤镜
    灰度 (Grayscale): 将图片转换为黑白。
    反色 (Invert): 将图片的颜色反转。
    棕褐色 (Sepia): 应用棕褐色滤镜,营造复古效果。
    色调 (Hue): 调整图片的主色调。
    饱和度 (Saturation): 提高或降低颜色饱和度。
  2. 模糊效果
    高斯模糊 (Gaussian Blur): 创建柔化的模糊效果。
    径向模糊 (Radial Blur): 从中心向外逐渐模糊。
    运动模糊 (Motion Blur): 模拟运动轨迹模糊。
  3. 锐化滤镜
    增强图片的细节,让图片显得更清晰。
  4. 光影和边缘
    浮雕 (Emboss): 使图片看起来像浮雕效果。
    边缘检测 (Edge Detection): 突出图片的边缘。
  5. 视觉特效
    马赛克 (Pixelation): 通过降低分辨率创建像素化效果。
    油画 (Oil Painting): 模拟油画质感。
    素描 (Sketch): 将图片转换为素描风格。

实现推荐

  1. 使用 BitmapTransformation
    Glide 的 BitmapTransformation 是实现滤镜效果的基础,适合简单的自定义滤镜(如颜色调整)。

  2. 使用 GPU 加速的滤镜库
    GPUImage for Android:
    提供了许多常用滤镜(如模糊、灰度、色调调整)。
    高效利用 GPU 处理图像,性能优秀。
    GitHub 地址

  1. 颜色调整滤镜
    灰度 (Grayscale)
class GrayscaleTransformation : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("GrayscaleTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)val canvas = Canvas(result)val paint = Paint()val colorMatrix = ColorMatrix().apply { setSaturation(0f) }paint.colorFilter = ColorMatrixColorFilter(colorMatrix)canvas.drawBitmap(toTransform, 0f, 0f, paint)return result}
}

反色 (Invert)

class InvertTransformation : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("InvertTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)val canvas = Canvas(result)val paint = Paint()val colorMatrix = ColorMatrix(floatArrayOf(-1f, 0f, 0f, 0f, 255f,0f, -1f, 0f, 0f, 255f,0f, 0f, -1f, 0f, 255f,0f, 0f, 0f, 1f, 0f))paint.colorFilter = ColorMatrixColorFilter(colorMatrix)canvas.drawBitmap(toTransform, 0f, 0f, paint)return result}
}

使用 Glide 的 BitmapTransformation 可以实现上述滤镜效果。下面分别为每种滤镜提供了示例实现代码:


1. 颜色调整滤镜

灰度 (Grayscale)
class GrayscaleTransformation : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("GrayscaleTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)val canvas = Canvas(result)val paint = Paint()val colorMatrix = ColorMatrix().apply { setSaturation(0f) }paint.colorFilter = ColorMatrixColorFilter(colorMatrix)canvas.drawBitmap(toTransform, 0f, 0f, paint)return result}
}
反色 (Invert)
class InvertTransformation : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("InvertTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)val canvas = Canvas(result)val paint = Paint()val colorMatrix = ColorMatrix(floatArrayOf(-1f, 0f, 0f, 0f, 255f,0f, -1f, 0f, 0f, 255f,0f, 0f, -1f, 0f, 255f,0f, 0f, 0f, 1f, 0f))paint.colorFilter = ColorMatrixColorFilter(colorMatrix)canvas.drawBitmap(toTransform, 0f, 0f, paint)return result}
}
棕褐色 (Sepia)
class SepiaTransformation : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("SepiaTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)val canvas = Canvas(result)val paint = Paint()val colorMatrix = ColorMatrix(floatArrayOf(0.393f, 0.769f, 0.189f, 0f, 0f,0.349f, 0.686f, 0.168f, 0f, 0f,0.272f, 0.534f, 0.131f, 0f, 0f,0f, 0f, 0f, 1f, 0f))paint.colorFilter = ColorMatrixColorFilter(colorMatrix)canvas.drawBitmap(toTransform, 0f, 0f, paint)return result}
}
色调 (Hue)饱和度 (Saturation)

你可以在 ColorMatrix 中调整色调或饱和度。与上述类似,通过修改 setRotatesetSaturation 调整效果。


2. 模糊效果

高斯模糊 (Gaussian Blur)

需要使用 RenderScript 或第三方库如 BlurKit:

class GaussianBlurTransformation(private val context: Context, private val radius: Float) : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("GaussianBlurTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val rs = RenderScript.create(context)val input = Allocation.createFromBitmap(rs, toTransform)val output = Allocation.createTyped(rs, input.type)val script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))script.setRadius(radius)script.setInput(input)script.forEach(output)output.copyTo(toTransform)rs.destroy()return toTransform}
}
径向模糊 (Radial Blur)

需要使用 OpenGL 或专用算法实现,这超出 Glide 基本能力。


3. 锐化滤镜

class SharpenTransformation : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("SharpenTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val result = pool.get(toTransform.width, toTransform.height, Bitmap.Config.ARGB_8888)val kernel = floatArrayOf(0f, -1f, 0f,-1f, 5f, -1f,0f, -1f, 0f)val paint = Paint()val canvas = Canvas(result)val colorMatrix = ColorMatrix()paint.colorFilter = ColorMatrixColorFilter(colorMatrix)canvas.drawBitmap(toTransform, 0f, 0f, paint)return result}
}

4. 光影和边缘

浮雕 (Emboss)

通过自定义滤镜:

val embossMatrix = floatArrayOf(-2f, -1f, 0f,-1f, 1f, 1f,0f, 1f, 2f
)
边缘检测 (Edge Detection)

使用卷积核进行边缘检测:

val edgeDetectionKernel = floatArrayOf(-1f, -1f, -1f,-1f, 8f, -1f,-1f, -1f, -1f
)

5. 视觉特效

马赛克 (Pixelation)

通过降低图片分辨率实现:

class PixelationTransformation(private val pixelSize: Int) : BitmapTransformation() {override fun updateDiskCacheKey(messageDigest: MessageDigest) {messageDigest.update("PixelationTransformation".toByteArray())}override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {val scaledBitmap = Bitmap.createScaledBitmap(toTransform, toTransform.width / pixelSize, toTransform.height / pixelSize, false)return Bitmap.createScaledBitmap(scaledBitmap, toTransform.width, toTransform.height, false)}
}
油画 (Oil Painting)素描 (Sketch)

需要实现复杂的算法,建议使用 GPUImage 或专用的图像处理库。


在 Glide 中应用滤镜

Glide.with(context).load(imageUrl).apply(RequestOptions.bitmapTransform(GrayscaleTransformation())).into(imageView)

通过上述方式,你可以逐步实现各种滤镜效果,满足项目需求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/64338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 参数配置使用 XML 文件的教程 || Python打包 || 模型部署

当配置项存储在外部文件(如 XML、JSON)时,修改配置无需重新编译和发布代码。通过更新 XML 文件即可调整参数,无需更改源代码,从而提升开发效率和代码可维护性。 1. 为什么选择 XML 配置文件 XML 配置文件具有多种优点…

Java从入门到工作2 - IDEA

2.1、项目启动 从git获取到项目代码后,用idea打开。 安装依赖完成Marven/JDK等配置检查数据库配置启动相关服务 安装依赖 如果个别依赖从私服下载不了,可以去maven官网下载补充。 如果run时提示程序包xx不存在,在项目目录右键Marven->Re…

Android显示系统(13)- 向SurfaceFlinger提交Buffer

Android显示系统(01)- 架构分析 Android显示系统(02)- OpenGL ES - 概述 Android显示系统(03)- OpenGL ES - GLSurfaceView的使用 Android显示系统(04)- OpenGL ES - Shader绘制三角…

【kubernetes】资源管理方式

目录 1. 说明2. 命令式对象管理3. 命令式对象配置4. 声明式对象配置5. 三种方式的对比 1. 说明 1.在Kubernetes(k8s)中,资源管理是一个核心功能,它允许用户通过操作资源来管理Kubernetes集群。2.Kubernetes将所有的内容都抽象为资…

【git、gerrit】特性分支合入主分支方法 git rebase 、git cherry-pick、git merge

文章目录 1. 场景描述1.1 分支状态 2. 推荐的操作方式方法 1:git merge(保留分支结构)方法 2:git rebase(线性合并提交历史)直接在master分支执行git merge br_feature,再 执行 git pull --reba…

211-基于FMC的1路1.5G ADC 1路 2.5G DAC子卡

一、板卡概述 FMC-1AD-1DA-1SYNC是我司自主研发的一款1路1G AD采集、1路2.5G DA回放的FMC、1路AD同步信号子卡。板卡采用标准FMC子卡架构,可方便地与其他FMC板卡实现高速互联,可广泛用于高频模拟信号采集等领域。 二、功能介绍 2.1 原理框图 2.2 硬件…

实操给自助触摸一体机接入大模型语音交互

本文以CSK6 大模型开发板串口触摸屏为例,实操讲解触摸一体机怎样快速增加大模型语音交互功能,使用户能够通过语音在一体机上查询信息、获取智能回答及实现更多互动功能等。 在本文方案中通过CSK6大模型语音开发板采集用户语音,将语音数据传输…

DocFlow票据AI自动化处理工具:出色的文档解析+抽取能力,提升企业文档数字化管理效能

目录 财务应付 金融信贷业务 近期,DocFlow票据自动化产品正式上线。DocFlow是一款票据AI自动化处理工具,支持不同版式单据智能分类扩展,可选功能插件配置流程,满足多样业务场景。 随着全球化与信息化进程,企业的文件…

英伟达垄断?中国芯片如何破局?

近期,全球AI芯片巨头英伟达被曝遭遇中国反垄断调查,引发行业广泛关注。 【图片来源于网络,侵删】 众所周知,在人工智能的浪潮中,英伟达无疑是全球AI算力市场的领头羊。在芯片领域,尤其是 GPU 市场&#xff…

用户体验测试与专项测试常用工具

用户体验(User Experience, UX)测试关注的是用户在使用软件产品时的主观感受。这包括用户界面的易用性、交互设计的友好性以及整体的满意度。UX测试不仅能够帮助开发人员发现产品中的潜在问题,还能为企业提供改善产品体验的建议。 功能亮点 …

40 基于单片机的温湿度检测判断系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机,采用dht11温湿度传感器检测温湿度, 通过lcd1602显示屏各个参数,四个按键分别可以增加温湿度的阈值, 如果超过阈值,则…

基于Matlab实现三维地球模型(源码)

利用MATLAB强大的图形处理能力和数学计算功能构建的可视化应用。这个模型允许用户在三维空间中观察地球,并且能够动态地旋转地球模型,同时还可以模拟卫星在其周围的运动轨迹,为学习地球科学、天文学以及航天工程等领域提供了一个直观的教学工…

JavaSe部分总结

我们先来了解一下Java语言,JavaSE是Java编程语言的标准版,主要是来学习Java的基本语法,书写方式,以及一些简单的逻辑循环和判断,包括一些关键字,特殊类(抽象类),特殊的方法(static修饰的方法,final修饰的方法)等等,最重要的是Java语言是比较C语言和C语言是比较简单的,Java是面向…

适用于 Windows 的 Podman

适用于 Windows 的 Podman 虽然“容器是 Linux”,但 Podman 也可以在 Mac 和 Windows 上运行,它提供原生 CLI 并嵌入来宾 Linux 系统来启动您的容器。此 guest 称为 Podman 计算机,并使用命令进行管理。在 Windows 上,每台 Podma…

Linux中 vim 常用命令大全详细讲解

文章目录 前言一、Vim 基本操作 🕹️1.1 打开或创建1.2 退出编辑1.3 模式切换 二、Vim 光标移动命令 ↕️2.1 基本移动2.2 行内移动2.3. 单词移动2.4. 页面移动2.5. 行跳转 三、Vim 文本编辑命令 📋3.1 插入和删除3.2 复制、剪切与粘贴3.3 替换与修改 四…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆,用以运送各种汽油、柴油、原油等油品,运输危险系数大,而且由于油罐车需要经常行驶在城区道路,为城市各个加油站点、企业工厂运输补充所需油料,因此也是危化品运输车辆的重点监测和管控对象…

联想至像M3070DW打印机连接手机方法

首先,按打印机上的“功能”键,上翻页翻到第4项“网络”按“OK”键进入; 点进去之后,再按下翻页翻到第3项“安装向导”,按“OK”键进入; 然后,选择我们要连接的WiFi并输入WiFi密码, 输…

双亲委派机制是Java类加载器的一种工作模式

双亲委派机制是Java类加载器的一种工作模式,确保了类加载的一致性和安全性。以下是对双亲委派机制的详细解析: 一、定义与工作原理 双亲委派机制(Parent Delegation Model)要求除了顶层的启动类加载器外,其余的类加载…

Qt 使用modbus协议

Qt 框架下 使用modbus协议 一,使用Qt原生的 QModbusClient ,比如QModbusTcpClient 1,因为modbus的读写 需要在同一个线程中,所以需要在主线程中利用moveToThread的方式,将业务逻辑封装到 子线程中。 2,m…

C语言中怎样将NULL定义为空指针?空指针的具体值其实为0哈,即地址值为0的指针为空指针。

用下面这条命令即可: #define NULL (void *)0下面是对这句代码的解释: #define NULL (void *)01. #define 的作用 #define 是一个预处理指令,用于定义宏。宏替换发生在编译前的预处理阶段,所有出现 NULL 的地方都会被替换为 (v…