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

WPF如何全局应用黑白主题效果

灰白色很多时候用于纪念,哀悼等。那么使用 WPF如何来做到这种效果呢?要实现的这种效果,我们会发现,它其实不仅仅是要针对图片,而是要针对整个窗口来实现灰白色。

如果只是针对图片的话,我可以可以对图片进行灰阶转换,即可达到灰色效果。

以下是图片转灰阶的代码,当然方法不仅仅是这一种:

//……省略……                FormatConvertedBitmap grayImage = new FormatConvertedBitmap();grayImage.BeginInit();grayImage.Source = originImage as BitmapSource;grayImage.DestinationFormat = PixelFormats.Gray32Float;grayImage.EndInit();                //……省略……

上述方法也可以直接在 xaml里面表示。

    <Image.Source>      <FormatConvertedBitmap DestinationFormat="Gray32">        <FormatConvertedBitmap.Source>          <BitmapImage UriSource="Images\1.png" />        </FormatConvertedBitmap.Source>      </FormatConvertedBitmap>    </Image.Source>

 如果我们想针对整个窗口应用这种灰色的效果,那我们可以用着色器特效( ShaderEffect)来实现。

说明:

  1. *.fx格式文件:是一种应用特效效果文件,也叫渲染管线的配置文件。编写该文件语言名为高阶着色器语言(High Level Shader Language,简称HLSL),由微软拥有及开发的一种语言。

  2. *.ps格式文件:是通过 *.fx文件编译出来的文件,该文件是通过 ShaderEffect所指定的原始文件。通过 ShaderEffect类,将其应用于 WPF

灰阶相关 fx, ps等文件已有大佬写好了,我们直接拿来用即可跳转下载(https://github.com/abursjoo/GrayscaleEffectSample/tree/master/WpfApplication1/WpfApplication1)。相关解释,会在注释中说明。

渲染管线配置文件(*.fx)

//sampler2D 2D纹理采样器//s0中,s表示取样器,0是表示取样器的子组件编号sampler2D implicitInput : register(s0);//c 表示缓冲区偏移量float factor : register(c0);//TEXCOORD 表示纹理坐标;COLOR 漫反射/镜面反射颜色float4 main(float2 uv : TEXCOORD) : COLOR{    //返回纹理implicitInput在uv位置的颜色。    float4 color = tex2D(implicitInput, uv);    //将颜色转成灰阶    float gray = color.r * 0.3 + color.g * 0.59 + color.b *0.11;        float4 result;        result.r = (color.r - gray) * factor + gray;    result.g = (color.g - gray) * factor + gray;    result.b = (color.b - gray) * factor + gray;    result.a = color.a;    return result;}

应用WPF中特效类 

    //灰阶特效public class GrayscaleEffect : ShaderEffect{//将像素着色器映射到灰阶着色器private static PixelShader _pixelShader = new PixelShader() { UriSource = new Uri(@"pack://application:,,,/GrayscaleEffect;component/GrayscaleEffect.ps") };public GrayscaleEffect(){PixelShader = _pixelShader;//更新着色器的值UpdateShaderValue(InputProperty);//该属性可以不要,该熟悉用于彩色到灰色过渡效果UpdateShaderValue(DesaturationFactorProperty);}public static readonly DependencyProperty InputProperty = ShaderEffect.RegisterPixelShaderSamplerProperty("Input", typeof(GrayscaleEffect), 0);public Brush Input{get { return (Brush)GetValue(InputProperty); }set { SetValue(InputProperty, value); }}public static readonly DependencyProperty DesaturationFactorProperty = DependencyProperty.Register("DesaturationFactor", typeof(double), typeof(GrayscaleEffect), new UIPropertyMetadata(0.0, PixelShaderConstantCallback(0), CoerceDesaturationFactor));//用于调节过渡效果public double DesaturationFactor{get { return (double)GetValue(DesaturationFactorProperty); }set { SetValue(DesaturationFactorProperty, value); }}private static object CoerceDesaturationFactor(DependencyObject d, object value){GrayscaleEffect effect = (GrayscaleEffect)d;double newFactor = (double)value;if (newFactor < 0.0 || newFactor > 1.0){return effect.DesaturationFactor;}return newFactor;}}

WPF里面的使用示例:

<!--effect 代表GrayscaleEffect所在的命名空间--><Grid.Effect><effect:GrayscaleEffect/></Grid.Effect>

需要应用到哪个根元素上,就将该特效给对应元素的 Effect 赋值即可。

这种实现方法,性能还是很不错的,如果想对 Shader有更深入的认识,可以阅读 《DirectX3DHLSL高级实例精讲》.

相关文章:

WPF如何全局应用黑白主题效果

灰白色很多时候用于纪念&#xff0c;哀悼等。那么使用 WPF如何来做到这种效果呢&#xff1f;要实现的这种效果&#xff0c;我们会发现&#xff0c;它其实不仅仅是要针对图片&#xff0c;而是要针对整个窗口来实现灰白色。 如果只是针对图片的话&#xff0c;我可以可以对图片进…...

[Qt] Qt删除文本文件中的某一行

需求 我们经常读一个文件或者直接往一个空白文件中写文本&#xff0c;那么该如何使用Qt在一个文本文件中删除某一行 代码 #include <QCoreApplication> #include <QIODevice> #include <QFile> #include <QTextStream> #include <QString> #i…...

【HarmonyOS学习日志(9)】一次开发,多端部署之界面级一多开发

关于一次开发&#xff0c;多端部署 一次开发多端部署就是指一套代码工程&#xff0c;一次开发上架&#xff0c;多端按需部署&#xff08;一多&#xff09;&#xff0c;用于支撑开发者快速高效地开发多终端设备上的应用&#xff0c;以节省开发成本。 HarmonyOS系统面向多终端&…...

基于Java+SSM+JSP+MYSQL实现的宠物领养收养管理系统功能设计与实现六

一、前言介绍&#xff1a; 免费学习&#xff1a;猿来入此 1.1 项目摘要 随着人们生活水平的提高&#xff0c;宠物已经成为越来越多家庭的重要成员。然而&#xff0c;宠物的数量增长也带来了一系列问题&#xff0c;如流浪宠物数量的增加、宠物健康管理的缺失以及宠物领养收养…...

Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化教…...

解析 Android WebChromeClient:提升 WebView 用户体验的关键组件

文章目录 一、总览二、详细说明三、一些实际和有趣的应用四、最佳实践五、与其他组件的比较六、安全性考虑&#xff1a;防止 XSS 攻击与数据泄露6.1 介绍6.2 代码案例6.2.1 输入过滤6.2.2 Content Security Policy (CSP) 案例 六、总结 在 Android 开发中&#xff0c;WebChrome…...

【LeetCode热题100】字符串

本篇博客记录了关于字符串相关的几道题目&#xff0c;包括最长公共前缀、最长回文子串、二进制求和、字符串相乘。 //解法1 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string ret strs[0];for(int i 1 ; i < strs.size() ; i…...

OceanBase 闪回查询

前言 在OB中&#xff0c;drop表可以通过 回收站 或者 以往的备份恢复来还原单表。当delete数据时&#xff0c;由于delete操作的对象不会进入回收站&#xff0c;此时需要通过闪回查询功能查看delete的数据&#xff0c;以便后续恢复 本次实验版本为 OceanBase 4.2.1.8&#xff0…...

C++析构函数详解

C析构函数详解&#xff1a;对象销毁与资源清理 在 C 中&#xff0c;析构函数是与构造函数相对应的特殊成员函数&#xff0c;它在对象生命周期结束时被自动调用&#xff0c;用于执行对象销毁之前的清理操作。析构函数主要用于释放对象占用的资源&#xff0c;如动态分配的内存、打…...

【网络安全 | 漏洞挖掘】未授权获取AI聊天内容

未经许可,不得转载。 文章目录 两天前,我收到了一项私人项目的邀请,内容看起来像是一个聊天机器人,类似于 Gemini 或 ChatGPT。于是我开始测试该项目的一些业务逻辑漏洞和 IDOR(不当访问控制)漏洞。尽管这个产品拥有一个强大的安全团队,网站上也部署了 WAF(Web 应用防火…...

时间序列分析——移动平均法、指数平滑法、逐步回归法、趋势外推法等(基于Python实现)

第 11章——时间序列分析和预测 【例11-1】 绘制时间序列折线图—观察成分 【代码框11-1】——绘制时间序列折线图 # 图11-2的绘制代码 import pandas as pd import matplotlib.pyplot as plt plt.rcParams[font.sans-serif]=[SimHei...

opencv(c++)----图像的读取以及显示

opencv(c)----图像的读取以及显示 imread: 作用&#xff1a;读取图像文件并将其加载到 Mat 对象中。参数&#xff1a; 第一个参数是文件路径&#xff0c;可以是相对路径或绝对路径。第二个参数是读取标志&#xff0c;比如 IMREAD_COLOR 表示以彩色模式读取图像。 返回值&#x…...

PyTorch——从入门到精通:PyTorch基础知识(张量)【PyTorch系统学习】

什么是张量&#xff08;Tensor&#xff09; ​ 张量在数学中是一个代数对象&#xff0c;描述了与矢量空间相关的代数对象集之间的多重线性映射。张量是向量和矩阵概念的推广&#xff0c;可以理解为多维数组。作为数学中的一个基本概念&#xff0c;张量有着多种类型&#xff0c;…...

(笔记)ubuntu20安装jdk7,多版本管理

前往 Oracle JDK 7 下载页面&#xff08;需要 Oracle 账户&#xff09;&#xff0c;下载 JDK 7 的压缩包文件&#xff08;.tar.gz&#xff09;。 下载完成后&#xff0c;将文件解压到 /opt 目录&#xff1a; sudo tar -xzf jdk-7u<version>-linux-x64.tar.gz -C /opt 重…...

Python系列教程

文章目录 1. Python基础2. Python基础库3. Python数据分析 1. Python基础 语句数据类型表达式输入、输出与文件读写函数模块与包类与面向对象作用域与命名空间常用技巧与操作 2. Python基础库 Typing库 3. Python数据分析...

如何恢復電腦IP地址的手動設置?

手動設置IP地址後&#xff0c;可能會遇到一些網路連接問題&#xff0c;或者需要恢復到之前的自動獲取狀態。這篇文章將詳細介紹如何恢復電腦的IP地址設置。 為什麼需要恢復IP地址設置&#xff1f; 網路連接問題&#xff1a;手動設置IP地址後&#xff0c;可能會導致與路由器或…...

Linux 下敏感文件路径总结

Linux 下敏感文件路径总结 在服务器运维和安全测试过程中&#xff0c;掌握各类服务的关键配置文件路径、日志文件位置以及重要目录的存放位置至关重要。本文整理了 Linux 系统下常见服务&#xff08;如 Apache、Nginx、MySQL 等&#xff09;的路径结构&#xff0c;以及一些敏感…...

gitlab 服务器集群配置及 存储扩展配置

配置 GitLab 服务器集群并实现存储扩展是一个复杂的任务&#xff0c;但可以通过以下步骤来实现。GitLab 本身支持高可用性和分布式部署&#xff0c;可以显著提高系统的可靠性和性能。 ### 1. 规划和准备 #### 1.1 确定服务器数量 - **1 台负载均衡器**&#xff1a;用于分发请…...

3D Gaussian Splatting 代码层理解之Part2

现在让我们来谈谈高斯分布。我们已经在Part1介绍了如何根据相机的位置获取 3D 点并将其转换为 2D。在本文中,我们将继续处理高斯泼溅的高斯部分。这里用到的是代码库 GitHub 中part2. 我们在这里要做的一个小改动是,我们将使用透视投影,它利用与上一篇文章中所示的不同内部…...

.length和.length()有什么区别?什么情况下使用哪个?

在编写程序的时候&#xff0c;我们经常发现有时候需要得到长度的时候我们使用函数.length&#xff0c;而有的时候用的却是.length()。 在对Java一知半解的时候&#xff0c;我曾产生了深深的疑惑&#xff0c;到底这两个有什么区别&#xff0c;为什么有时候要有括号&#xff0c;而…...

Validity90图像格式揭秘:从原始数据到PNG指纹图像

Validity90图像格式揭秘&#xff1a;从原始数据到PNG指纹图像 【免费下载链接】Validity90 Reverse engineering of Validity/Synaptics 138a:0090, 138a:0094, 138a:0097, 06cb:0081, 06cb:009a fingerprint readers protocol 项目地址: https://gitcode.com/gh_mirrors/va/…...

深入Logos FPGA的PCB布局:如何针对FBG256、FBG484和LPG封装优化你的设计

深入Logos FPGA的PCB布局&#xff1a;如何针对FBG256、FBG484和LPG封装优化你的设计 在硬件设计领域&#xff0c;FPGA的PCB布局一直是工程师面临的核心挑战之一。特别是当项目需要在性能、成本和尺寸之间寻找平衡点时&#xff0c;封装选择往往成为决定成败的关键因素。Logos系列…...

SpringBoot+Vue Spring Boot可盈保险合同管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL

系统架构设计### 摘要 随着保险行业的快速发展&#xff0c;传统的手工管理模式已无法满足现代保险业务的高效需求。保险合同管理系统作为保险业务的核心支撑&#xff0c;亟需通过信息化手段提升管理效率&#xff0c;降低人工操作错误率。当前市场上许多保险公司的合同管理仍依赖…...

深度解析:如何高效实现Android应用级定位模拟的完整方案

深度解析&#xff1a;如何高效实现Android应用级定位模拟的完整方案 【免费下载链接】FakeLocation Xposed module to mock locations per app. 项目地址: https://gitcode.com/gh_mirrors/fak/FakeLocation 在移动应用开发和测试领域&#xff0c;精准控制定位信息是确保…...

ElevenLabs IVR语音制作避坑手册(2024最新版):92%开发者踩过的5类语音延迟/断连/语义失准陷阱

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs IVR语音制作避坑手册导论 在构建高可用、高自然度的智能语音应答&#xff08;IVR&#xff09;系统时&#xff0c;ElevenLabs 以其超拟真语音合成能力成为热门选择。然而&#xff0c;其 API …...

降AI率软件9平台覆盖测评:嘎嘎降自研稳定vs套壳工具单平台!

降AI率软件9平台覆盖测评&#xff1a;嘎嘎降自研稳定vs套壳工具单平台&#xff01; 「支持知网维普」实际只能稳定降一个平台&#xff0c;这是怎么回事&#xff1f; 我是双学位本科生&#xff0c;毕业论文 3.5 万字。学校规定送知网做 AIGC 检测&#xff0c;但导师建议我自己…...

基于陷门矩阵的高效安全委托计算方案

1. 项目概述在现代计算环境中&#xff0c;线性代数运算&#xff08;如矩阵乘法&#xff09;占据了大量计算资源。随着云计算和机器学习的发展&#xff0c;越来越多的计算任务被委托给云端服务器执行。然而&#xff0c;这种委托计算模式带来了严重的数据隐私问题——用户需要将原…...

React网格布局终极指南:3步掌握拖拽式界面开发

React网格布局终极指南&#xff1a;3步掌握拖拽式界面开发 【免费下载链接】react-grid-layout A draggable and resizable grid layout with responsive breakpoints, for React. 项目地址: https://gitcode.com/gh_mirrors/re/react-grid-layout React网格布局&#x…...

工业传动避坑:3 个皮带张力调节技巧,杜绝早期失效

工业传动避坑&#xff1a;3 个皮带张力调节技巧&#xff0c;杜绝早期失效在工业传动系统运维中&#xff0c;盖茨同步带、工业皮带的早期失效是高频痛点——不少工程师频繁更换皮带&#xff0c;却始终无法解决根本问题&#xff0c;反而增加运维成本。事实上&#xff0c;90%以上的…...

【Prometheus】如何排查一个 Target 显示为 “DOWN” 的问题?常见的原因有哪些(网络、端口、路径、认证)?

Prometheus Target “DOWN” 问题深度排查指南:从网络到认证的全链路诊断 用户问题原文:“如何排查一个 Target 显示为 ‘DOWN’ 的问题?常见的原因有哪些(网络、端口、路径、认证)?” 在超大规模生产环境中,Prometheus 监控着成千上万的目标实例。当某个关键业务的监控…...