首页/新闻资讯/正文详情

React Native Skia 位移贴图(DisplacementMap)图像滤镜完整指南:原理、参数与源码解析

发布时间:2026/9/25 7:17:48 来源:云帆数科 栏目:资讯中心
React Native Skia 位移贴图(DisplacementMap)图像滤镜完整指南:原理、参数与源码解析
图形学移动开发跨平台UI组件【免费下载链接】react-native-skiaHigh-performance React Native Graphics using Skia项目地址https://gitcode.com/gh_mirrors/re/react-native-skia点击查看免费下载DisplacementMap是 React Native Skia 提供的图像滤镜组件它借用子图像通常是噪声着色器的像素通道值对目标图像进行空间扭曲实现水波、涟漪、液化等变形效果其语义与 SVG 的feDisplacementMap完全一致。读完本文你将掌握位移贴图滤镜的位移公式、全部参数与取值含义、与 Perlin 噪声Turbulence的组合用法并通过仓库源码理解其底层实现链路与常见坑点。什么是位移贴图滤镜位移贴图Displacement Map是图像处理中最常见的空间变形手段之一它不用颜色矩阵去改变像素的色值而是根据**另一张图贴图**中特定颜色通道的数值去计算每个像素应该从哪个位置采样从而把画面推挤成起伏扭曲的样子。在 React Native Skia 中DisplacementMap组件与 SVG 标准元素feDisplacementMap语义一致文档原文在 apps/docs/docs/image-filters/displacement-map.md。核心变换公式如下P(x,y) ← P( x scale * (XC(x,y) - 0.5), y scale * (YC(x,y) - 0.5))其中P(x, y)是子图像即被扭曲的原始画面在(x, y)处的像素P(x, y)是目标位置输出画面处的像素XC(x, y)、YC(x, y)分别是贴图中由channelX、channelY指定的颜色通道在(x, y)处的分量值归一化到 01scale是位移缩放因子。也就是说输出像素的取样点被贴图通道值拉开或拉近当通道值为 0.5 时(XC - 0.5) 0该像素不发生偏移当通道值趋向 0 时沿负方向偏移趋向 1 时沿正方向偏移。scale决定了通道值差 0.5 时对应的最大偏移像素数。参数说明参数类型说明channelXColorChannel用于沿 X 轴位移的颜色通道取值r、g、b、achannelYColorChannel用于沿 Y 轴位移的颜色通道取值r、g、b、ascalenumber位移缩放因子决定扭曲强度children?ImageFilter可选子元素作为先应用的图像滤镜 / 位移贴图来源其中ColorChannel类型在仓库中的定义位于 packages/skia/src/skia/types/ImageFilter/ImageFilterFactory.ts是一个枚举R / G / B / AReact 组件层的 props 类型定义DisplacementMapImageFilterProps位于 packages/skia/src/dom/types/ImageFilters.ts其中channelX、channelY是SkEnumtypeof ColorChannelscale为number三者均为必填。实际使用中channelX与channelY可以指向不同的通道。文档示例选择channelXg绿色通道驱动 X 轴偏移与channelYaAlpha 通道驱动 Y 轴偏移而常用的Turbulence噪声贴图在不同通道上有不同的灰度分布因此换用r、b等通道会得到完全不同的扭曲纹理走向——这是调参时最容易出效果差异的地方。组件使用示例用 Perlin 噪声扭曲图片文档示例与仓库 e2e 测试完全一致使用 Perlin 噪声Turbulence组件作为位移贴图对一张图片施加波纹扭曲import { Canvas, Image, Turbulence, DisplacementMap, useImage } from shopify/react-native-skia; const Filter () { const image useImage(require(./assets/oslo.jpg)); if (!image) { return null; } return ( Canvas style{{ width: 256, height: 256 }} Image image{image} x{0} y{0} width{256} height{256} fitcover DisplacementMap channelXg channelYa scale{20} Turbulence freqX{0.01} freqY{0.05} octaves{2} seed{2} / /DisplacementMap /Image /Canvas ); };这里几个值得注意的点Turbulence作为DisplacementMap的子元素提供的是逐像素的通道值供channelX/channelY采样。freqX、freqY控制噪声频率数值越小扭曲的波纹越平缓、尺度越大octaves控制噪声叠加的层数层数越多细节越丰富seed控制随机种子改变扭曲纹理的形态。Turbulence的完整用法见 Perlin 噪声文档。scale{20}表示通道值偏离 0.5 时最多让像素偏移 20 个单位scale越大变形越剧烈过大的值会让画面撕裂感明显。DisplacementMap必须作为Image或其他可绘制节点的子节点存在它作用于其父节点的绘制结果。关于children参数的类型文档参数表标注为可选的ImageFilter但从仓库的 sksg 录制实现看该组件实际期望子元素是一个 shader如Turbulence在 packages/skia/src/sksg/Recorder/commands/ImageFilters.ts 的declareDisplacementMapImageFilter中实现会先从绘制上下文中弹出一个 shaderconst shader ctx.shaders.pop(); if (!shader) { throw new Error(DisplacementMap expects a shader as child); } const map ctx.Skia.ImageFilter.MakeShader(shader); const imgf ctx.Skia.ImageFilter.MakeDisplacementMap( ColorChannel[enumKey(channelX)], ColorChannel[enumKey(channelY)], scale, map, null ); ctx.imageFilters.push(imgf);可以看到子 shader 首先通过MakeShader被转换成一张贴图SkImageFilter随后与channelX、channelY、scale一起传入MakeDisplacementMap并作为图像滤镜压入绘制上下文。如果忘记给DisplacementMap传入子元素运行时会抛出DisplacementMap expects a shader as child错误这是使用中最常见的报错之一。底层 API 与跨端实现命令式 APIMakeDisplacementMap滤镜底层的工厂方法定义在 packages/skia/src/skia/types/ImageFilter/ImageFilterFactory.ts 的ImageFilterFactory接口中MakeDisplacementMap( channelX: ColorChannel, channelY: ColorChannel, scale: number, in1: SkImageFilter, input?: SkImageFilter | null, cropRect?: SkRect | null ): SkImageFilter;其中in1是作为位移贴图的图像滤镜即由 shader 转换而来input是被扭曲的源图传null时使用动态源图像即父节点的绘制结果cropRect可对输入输出做裁剪。这也是声明式DisplacementMap组件在底层最终调用到的 API。Web 端CanvaKit实现在 Web 平台上实现位于 packages/skia/src/skia/web/JsiSkImageFilterFactory.ts 的MakeDisplacementMap它通过getEnum(this.CanvasKit, ColorChannel, channelX)将 TS 层的通道枚举映射为 CanvaKit 的枚举值再调用CanvasKit.ImageFilter.MakeDisplacementMap(channelX, channelY, scale, in1, inputFilter)。注意该实现会在传入cropRect时打印一条警告cropRect is not supported on React Native Web for MakeDisplacementMap说明 Web 端暂不支持裁剪矩形参数。组件封装React 组件层只是一个薄封装packages/skia/src/renderer/components/imageFilters/DisplacementMap.tsx 将 props 直接透传给 DOM 节点skDisplacementMapImageFilter该节点随后进入 sksg 录制管线被上文所述的 Recorder 命令消费。整个调用链可以概括为DisplacementMap channelX channelY scale → DOM 节点 skDisplacementMapImageFilter → sksg Recorder: declareDisplacementMapImageFilter → Skia.ImageFilter.MakeShader(子 shader) → Skia.ImageFilter.MakeDisplacementMap(channelX, channelY, scale, map) → 原生 Skia / Web CanvaKit 实现测试验证文档即测试仓库将文档示例直接固化为 e2e 测试见 packages/skia/src/renderer/tests/e2e/ImageFilters.spec.tsx 中的use the displacement map as documented用例它使用与本文示例完全一致的参数channelXg、channelYa、scale{20}、Turbulence freqX{0.01} freqY{0.05} octaves{2} seed{2}对oslo.jpg施加位移滤镜后与基准截图比对。这说明文档示例是经过渲染验证、可直接照抄运行的代码也意味着你可以把该测试作为调参的参考基准。小结与调参建议DisplacementMap是 React Native Skia 图像滤镜体系中功能最物理的一支——它不做颜色混合而是通过贴图通道驱动空间取样。实用建议贴图来源优先用TurbulencePerlin 噪声天然平滑连续适合水面、熔岩、能量场等扭曲效果也可以尝试其它 shader甚至用运行时着色器Runtime Shader自定义贴图生成逻辑。channelX与channelY搭配不同的通道例如ga、rb组合不同通道可让 X/Y 方向呈现不同的扭曲纹理若两个方向使用同一通道则扭曲更对称。scale从小往大调先给5再逐步增大到20、40避免一开始就出现过度撕裂。子元素必填忘记传Turbulence等 shader 会直接抛错这是最常见的集成问题。滤镜整体的组合方式如多层滤镜嵌套、与Blur、Offset、Shadow搭配可进一步参考 图像滤镜总览 文档。赞分享图形学移动开发跨平台UI组件【免费下载链接】react-native-skiaHigh-performance React Native Graphics using Skia项目地址https://gitcode.com/gh_mirrors/re/react-native-skia点击查看免费下载相关推荐react-native-skia 图像模糊滤镜 Blur 完全指南Sigma 参数与 TileMode 边缘处理详解react native skia 图像模糊滤镜 Blur 完全指南Sigma 参数与 TileMode 边缘处理详解 本文以 react native sk图形学移动开发跨平台UI组件React Native Skia Morphology 图像滤镜基于 Skia 的腐蚀erode与膨胀dilate实现指南React Native Skia Morphology 图像滤镜基于 Skia 的腐蚀erode与膨胀dilate实现指南 Morphology形图形学移动开发跨平台UI组件告别直升机模式华硕笔记本风扇静音改造完全指南告别直升机模式华硕笔记本风扇静音改造完全指南 你是否曾在深夜工作时笔记本风扇突然起飞打断你的思绪或者在视频会议中风扇噪音让你不得不重复发言如果桌面应用系统编程上一篇从入门到精通Yolov7-tracker核心功能详解与环境搭建教程下一篇视频分析革命3分钟看懂AI如何让长视频变精华创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

Atlas 300V 24G实战:YOLO模型在昇腾平台的完整部署指南
Atlas 300V 24G实战:YOLO模型在昇腾平台的完整部署指南

1. 项目缘起:为什么我会盯上Atlas这块卡先说下背景。我这边团队一直在做边缘侧的工业视觉检测项目,手里的训练服务器跑YOLO系列跑得很顺,但一到现场部署就头疼。客户现场的工控机大多是老掉牙的CPU平台,显卡要么没有,要… · 2026/9/25 7:17:48

JUnit 4 贡献指南详解:构建流程、编码规范与 Pull Request 提交流程
JUnit 4 贡献指南详解:构建流程、编码规范与 Pull Request 提交流程

测试开发工具 【免费下载链接】junit4 A programmer-oriented testing framework for Java — :warning: maintenance mode 项目地址: https://gitcode.com/gh_mirrors/ju/junit4 点击查看 免费下载 本指南以仓库根目录的 CONTRIBUTING.md 为核心,系统讲… · 2026/9/25 7:17:48

Atlas 300V 24G部署YOLO全攻略:推理加速卡实战指南
Atlas 300V 24G部署YOLO全攻略:推理加速卡实战指南

1. Atlas 300V 24G到底是个啥:先厘清加速卡身份1.1 从“是不是运算加速卡”说起我经常在社区里看到有人问“atlas 300V 24G是运算加速卡吗”,这种问题背后其实藏着两种常见的误解:一是把它当成纯GPU,二是觉得它只是个普通显卡&… · 2026/9/25 7:17:48

PowerShell在Windows权限提升中的应用与防御检测
PowerShell在Windows权限提升中的应用与防御检测

Windows环境下的权限提升,是我在安全评估和系统加固工作中反复要面对的话题。无论是红队演练报告里的“普通域用户拿到SYSTEM权限”,还是日常巡检发现的“某个第三方服务目录Everyone可写”,背后几乎都能看到PowerShell脚本的影子。这篇文章结… · 2026/9/25 7:49:14

网络安全应急演练实战指南:从ATTCK场景设计到复盘闭环
网络安全应急演练实战指南:从ATTCK场景设计到复盘闭环

简介:这份文档资料聚焦网络安全应急演练,面向政府机构、企事业单位的安全管理人员、普通员工及专业应急处理人员,帮助组织建立并落地网络安全应急响应预案的培训与实战演练机制。内容围绕应急响应预案培训与演练的目的、培训要求与方式、培训… · 2026/9/25 7:49:14

OptiScaler 完整实战指南:免费替换 DLSS / FSR / XeSS 超采样,还能给游戏补帧生成
OptiScaler 完整实战指南:免费替换 DLSS / FSR / XeSS 超采样,还能给游戏补帧生成

OptiScaler 完整实战指南:免费替换 DLSS / FSR / XeSS 超采样,还能给游戏补帧生成 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR-FG/XeF… · 2026/9/25 7:49:14

使用 Envelop 与 GraphQL-Helix 构建可插拔的 GraphQL 服务器:graphql-helix 示例深度解析
使用 Envelop 与 GraphQL-Helix 构建可插拔的 GraphQL 服务器:graphql-helix 示例深度解析

后端API设计 【免费下载链接】graphql-yoga 🧘 Rewrite of a fully-featured GraphQL Server with focus on easy setup, performance & great developer experience. The core of Yoga implements WHATWG Fetch API and can run/deploy on any JS environment.… · 2026/9/25 7:49:14

网络安全设备配置规范:防火墙、交换机、路由器安全基线加固指南
网络安全设备配置规范:防火墙、交换机、路由器安全基线加固指南

简介:网络安全基线是构建可信网络环境的基础,其核心原理遵循最小开放、默认拒绝、管理面与转发面分离等原则。在工程实践中,通过安全设备配置规范能够有效降低攻击面,避免因策略次序、服务暴露或日志缺失导致的安全事故。此类规范… · 2026/9/25 7:49:14

highlight.io React Native(beta)监控实战:基于 OpenTelemetry 接入日志、错误与链路追踪
highlight.io React Native(beta)监控实战:基于 OpenTelemetry 接入日志、错误与链路追踪

可观测性后端 【免费下载链接】highlight highlight.io: The open source, full-stack monitoring platform. Error monitoring, session replay, logging, distributed tracing, and more. 项目地址: https://gitcode.com/gh_mirrors/hi/highlight 点击查看 免费下… · 2026/9/25 7:49:08

数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)
数值优化(Numerical Optimization)学习系列-03-共轭梯度方法(Conjugate Gradient)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31

MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码