UWP Composition Api 是否支持颜色替换?

2024-03-06

我一直在尝试寻找与颜色替换相关的示例,这是一个使用 Photoshop 的示例,例如,它可以采用蓝色阴影并将其替换为红色阴影:

BEFORE: enter image description here

AFTER: enter image description here

使用最新版本的 Composition Api 中的 Composition Effects 是否可以实现这一点?

我看过与色调旋转、温度和色调相关的示例:

https://xamlbrewer.wordpress.com/2016/04/08/uwp-composition-effects-hue-rotation/ https://xamlbrewer.wordpress.com/2016/04/08/uwp-composition-effects-hue-rotation/

https://xamlbrewer.wordpress.com/2016/04/19/uwp-composition-effects-Temperature-and-tint/ https://xamlbrewer.wordpress.com/2016/04/19/uwp-composition-effects-temperature-and-tint/

但我想知道 api 是否能够使用效果来切换图像中的颜色范围?


我有一个你可能会喜欢的解决方案。示例如下所示:

为了实现这一点,我使用了 3 个连锁效果:PixelShaderEffect, GaussianBlurEffect and BlendEffect from Win2d API.

XAML 有CanvasAnimatedControl绘制结果加上一些助手,例如源(我们要替换的颜色)并替换颜色选择器和阈值滑块。

<Grid>
    <xaml:CanvasAnimatedControl x:Name="AnimatedControl"
                            CreateResources="AnimatedControl_OnCreateResources"
                            Draw="AnimatedControl_OnDraw"/>

    <StackPanel HorizontalAlignment="Left" VerticalAlignment="Bottom">
        <TextBlock Text="Source Color" FontSize="32" Foreground="White" TextAlignment="Center"/>

        <ColorSpectrum Width="256" Height="256" ColorChanged="ColorSpectrum_OnColorChanged"/>
    </StackPanel>

    <StackPanel HorizontalAlignment="Right" VerticalAlignment="Bottom">
        <TextBlock Text="Replace Color" FontSize="32" Foreground="White" TextAlignment="Center"/>

        <ColorSpectrum Width="256" Height="256" ColorChanged="ColorSpectrum_OnColorChanged1"/>
    </StackPanel>

    <Slider Width="512" ValueChanged="RangeBase_OnValueChanged" VerticalAlignment="Center"/>
</Grid>

背后代码:

    private PixelShaderEffect _textureShader;
    private GaussianBlurEffect _blur;
    private BlendEffect _blend;

    private void AnimatedControl_OnCreateResources(CanvasAnimatedControl sender, CanvasCreateResourcesEventArgs args)
    {
        args.TrackAsyncAction(CreateResourcesAsync(sender).AsAsyncAction());
    }

    private async Task CreateResourcesAsync(CanvasAnimatedControl sender)
    {
        var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/Shaders/TextureTest.bin"));
        var buffer = await FileIO.ReadBufferAsync(file);

        var sourceImage = await CanvasBitmap.LoadAsync(sender, new Uri("ms-appx:///Assets/image.jpg"));

        _textureShader = new PixelShaderEffect(buffer.ToArray())
        {
            Source1 = sourceImage
        };

        _blur = new GaussianBlurEffect
        {
            BlurAmount = 4,
            Source = _textureShader
        };

        _blend = new BlendEffect
        {
            Foreground = _blur,
            Background = sourceImage,
            Mode = BlendEffectMode.Color
        };
    }

    private void AnimatedControl_OnDraw(ICanvasAnimatedControl sender, CanvasAnimatedDrawEventArgs args)
    {
        args.DrawingSession.DrawImage(_blend);
    }

    private void RangeBase_OnValueChanged(object sender, RangeBaseValueChangedEventArgs e)
    {
        _textureShader.Properties["threshold"] = (float)e.NewValue / 100;
    }

    private void ColorSpectrum_OnColorChanged(ColorSpectrum sender, ColorChangedEventArgs args)
    {
        _textureShader.Properties["sourceColor"] = new Vector3((float)args.NewColor.R / 255, (float)args.NewColor.G / 255, (float)args.NewColor.B / 255);
    }

    private void ColorSpectrum_OnColorChanged1(ColorSpectrum sender, ColorChangedEventArgs args)
    {
        _textureShader.Properties["replaceColor"] = new Vector3((float)args.NewColor.R / 255, (float)args.NewColor.G / 255, (float)args.NewColor.B / 255);
    }

最令人兴奋的是像素着色器:

#define D2D_INPUT_COUNT 1
#define D2D_INPUT0_SIMPLE

#include "d2d1effecthelpers.hlsli"

float3 sourceColor;
float3 replaceColor;
float threshold;

D2D_PS_ENTRY(main)
{
    float3 color = D2DGetInput(0).rgb;

    if (abs(color.r - sourceColor.r) < threshold && abs(color.g - sourceColor.g) < threshold && abs(color.b - sourceColor.b) < threshold) 
    {
        float3 newColor = color - sourceColor + replaceColor;
        return float4(newColor.r, newColor.g, newColor.b, 1);
    }
    else 
    {
        return float4(0, 0, 0, 0);
    }
}

要编译它,您应该访问这里:https://github.com/Microsoft/Win2D-Samples/tree/master/ExampleGallery/Shared/Shaders https://github.com/Microsoft/Win2D-Samples/tree/master/ExampleGallery/Shared/Shaders

有一个 cmd 文件可以编译 hlsl 着色器。如果您需要一些帮助 - 评论它。玩得开心!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UWP Composition Api 是否支持颜色替换? 的相关文章

  • X11 模式对话框

    如何使用 Xlib 在 X11 中创建模式对话框 模态对话框是一个位于应用程序其他窗口之上的窗口 就像瞬态窗口一样 并且拒绝将焦点给予应用程序的其他窗口 在 Windows 中 当试图从模态窗口夺取焦点时 模态也会通过闪 烁模态窗口的标题栏
  • Linq - 从表达式 创建表达式

    我有一个谓词Expression
  • 为什么我会收到未找到分析器的警告?

    我创建了一个玩具项目来检查最新的 NET 7 预览版 5 和正则表达式代码生成 它效果很好 所以我对现有项目应用了相同的更改 不是为了生产 而是为了个人生产力 由于某种原因 我收到这些警告 CS8032 An instance of ana
  • 生成多个随机数

    我想生成 25 个唯一的随机数并将它们列在控制台中 数字的长度应至少为 10 个字符 有什么简单的方法可以做到这一点吗 尝试将数字构建为字符串 并使用 HashSet 确保它们是唯一的 Random random new Random Ha
  • 自动映射器多对多 stackoverflowException

    我遇到以下映射的堆栈溢出 Mapper CreateMap
  • 将公历日期转换为儒略日期,然后再转换回来(随着时间)

    我正在编写一个程序 必须将当前的公历日期和时间转换为儒略日期 然后再转换回公历门 最终我需要添加能够添加年 月 日 小时 分钟和秒的功能 但我需要先解决这部分问题 现在我已经从公历日期转换为儒略日期 所以从逻辑上讲 我觉得我应该能够以某种方
  • 为什么子函数不销毁GtkWindow?

    这是我的代码 void window first void enter window2 GtkWidget w gpointer data void quit GtkWidget w gpointer data void quit int
  • 如何从 Qt 应用程序通过 ODBC 连接到 MySQL 数据库?

    我有一个新安装的 MySQL 服务器 它监听 localhost 3306 从 Qt 应用程序连接到它的正确方法是什么 原来我需要将MySQL添加到ODBC数据源 我在遵循这个视频教程后做到了这一点 https youtu be K3GZi
  • C# 无法捕获 SerializationException

    我的程序在加载序列化文件的部分遇到问题 如果文件无法反序列化 我希望很好地失败 但由于某种原因 我的程序将中断而不是进入 catch 子句 这是我的代码 using FileStream fs new FileStream openFile
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 如何将STL容器数据转储到gdb中?

    我无法在 gdb 中转储 STL 无序映射容器值 变量类型是 std unordered map var 我的 gdb 版本 7 7 1 GDB配置 configure host x86 64 linux gnu target x86 64
  • 从 DataRow 单元格解析 int [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 如何从 DataRow 单元格解析 int 值 Int32 Parse item QuestionId ToString 这段代码可以工作 但看
  • valgrind 在 Raspberry Pi 上返回未处理的指令

    我最近一直在尝试在运行 Debian GNU Linux7 0 喘息 的树莓派 型号 b 上使用 valgrind 来调试分段错误 每次我在编译的 C 程序上运行 valgrind 时 都会得到类似以下内容的信息 disInstr arm
  • 使用多态对象数组进行 JSON 反序列化

    我在涉及多态对象数组的 JSON 反序列化方面遇到问题 我已经尝试过记录的序列化解决方案here https stackoverflow com questions 5186973 json serialization of array w
  • 当我的进程被终止时到底会发生什么?

    我有一个包含本机代码和托管代码的混合进程 在 Windows Server 2003 上运行 当我从进程资源管理器中终止进程时 它会进入 100 cpu 的状态 并在消失之前保持这种状态一段时间 有时甚至 10 分钟 在此期间我无法 杀死
  • Boost.asio和异步链,unique_ptr?

    我对异步编程不太熟悉 我有一个问题 我的问题如下 给出 boost asio 中 C 11 的 echo server 示例 http www boost org doc libs 1 60 0 doc html boost asio ex
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • 读取大型制表符分隔文件分块时出现异常

    我有一个 350MB 制表符分隔的文本文件 如果我尝试将其读入内存 则会出现内存不足异常 所以我正在尝试一些类似的事情 即只阅读几列 import pandas as pd input file and path r C Christian
  • Python 256位哈希函数,带数字输出

    我需要一个具有 256 位输出 如 long int 的哈希函数 首先 我认为我可以使用 hashlib 中的 SHA256 但它有一个字符串输出 我需要一个数字来计算 将 32 字节字符串转换为 long 也可以 但我没有找到任何东西 在
  • 快速文件复制并取得进展

    我正在为 Linux 编写一个 SDL 应用程序 它可以从控制台运行 无 X 服务器 我拥有的一个功能是文件复制机制 它将特定文件从 HDD 复制到 USB 闪存设备 并在 UI 中显示此复制的进度 为此 我使用简单的 while 循环并按
  • 当嵌入类型具有 UnmarshalJSON 时,json.Unmarshal 失败

    我正在尝试解组具有嵌入类型的结构 当嵌入类型具有 UnmarshalJSON 方法时 外部类型的解组失败 https play golang org p Y Tt5O8A1Q https play golang org p Y Tt5O8A
  • 编辑pip安装的包

    我正在尝试编辑通过 pip 安装的一个名为 py mysql2pgsql 的包 将数据库从 mysql 转换为 postgre 时出现错误 就像this https stackoverflow com questions 26008398
  • 保留 string_agg 内部的不同顺序

    Mysql函数 with recursive locpais as select l id l nome l tipo tid lp pai from loc l left join locpai lp on lp loc l id whe
  • 根据类别对表列的所有值求和

    我正在尝试根据特定类检索 td 中所有值的总和 该代码不会抛出任何错误 但我的总和始终为 0 数值是否必须以特定方式指定 我在这里看到了一些其他答案 从哪里模仿了代码 我没有看到我的和他们的有任何真正的区别 所以我很困惑为什么我的不起作用
  • 如何等待ShellExecute运行?

    我设法在 VC 中使用 ShellExecute 来启动文档 现在我希望运行一个接收一些参数的命令行工具 并在后台运行 隐藏 而不是最小化 并让它阻止我的程序流程 以便我能够等待它完成 如何更改命令行 ShellExecute NULL o
  • 如何设置xAxis标签之间的间距

    我遇到了图表显示的问题 你可以从图片中看到它 旧版本的图表有apispaceBetweenLabels设置标签之间的间距 我只找到apispaceMax and spaceMin在最新版本中 我尝试使用它们来设置标签之间的空间 但失败了 我
  • NLTK Python 中的词义消歧

    我是 NLTK Python 的新手 我正在寻找一些可以进行词义消歧的示例应用程序 我在搜索结果中有很多算法 但没有示例应用程序 我只是想传递一句话 并想通过参考wordnet库来了解每个单词的含义 谢谢 我在 PERL 中找到了类似的模块
  • 为 Node / MongoDB 应用程序播种的最佳方法是什么?

    所以 我是 MEAN 堆栈的新手 在尝试为 MongoDB 播种时遇到了困难 我正在使用 Mongoose 与数据库进行通信 并且有大量文档表明我应该能够使用填充的 JSON 文件进行播种 我尝试过的 节点 mongo 种子 https w
  • 不使用 oledb 将 Excel 工作表数据导入到 datagrid

    在我的基于 Windows 的应用程序中 C 我想导入 Excel 工作表以在 DatatGridView 中显示其数据 我不想使用 oledb any Help using Excel Microsoft Office Interop E
  • 为什么 gets() 被弃用? [复制]

    这个问题在这里已经有答案了 使用时gets 在我的代码中 编译器大喊 warning the gets function is dangerous and should not be used and warning gets is dep
  • 如何使用 php 和 shell 脚本捕获和提供 telnet?

    这就是我想使用 php 完成的任务 可能使用 excel 使用名为 proxychains 的程序远程登录到 whois 注册商 proxychains telent whois someregistrar 43 如果失败 gt 重试 1
  • xPath:获取父级和第二个兄弟级

    我有一个巨大的 XML 我需要在其中找到支付金额 它距离单元格 2 个单元格CellText amount
  • Google 为现有自动完成参考提供了 API 调用返回 NOT_FOUND 的详细信息

    我有一个问题也许有人也有同样的问题 我正在调用 google place autocomplete api 调用 然后我向用户展示结果 他可以选择地点 根据选择 我正在拨打地点详细信息并检索该地点的详细信息 我的问题是 某些情况下详细信息服
  • 对UITableView使用didSelectRowAtIndexPath或prepareForSegue方法?

    我正在使用情节提要 并且有一个 UITableView 我有一个从我的表推送到详细 VC 的 segue 设置 但我应该使用哪种方法来处理这个问题呢 我必须将几个对象传递到详细视图 但我用吗didSelectRowAtIndex or vo
  • 如何检查使用堆栈安装的软件包版本?

    在我的项目的 cabal 文件中 我有以下内容executable部分 executable ArchPkgstatsScraper hs source dirs app main is Main hs ghc options thread
  • Selenium 启动的 ChromeDriver 在后台保持运行

    I am not able to completely delete a project because the chromedriver instance is running in the background even when th
  • UWP Composition Api 是否支持颜色替换?

    我一直在尝试寻找与颜色替换相关的示例 这是一个使用 Photoshop 的示例 例如 它可以采用蓝色阴影并将其替换为红色阴影 BEFORE AFTER 使用最新版本的 Composition Api 中的 Composition Effec