[UWP]分享一个基于HSV色轮的调色板应用

简介: 原文:[UWP]分享一个基于HSV色轮的调色板应用1. 前言 上一篇文章介绍了HSV色轮,这次分享一个基于HSV色轮的调色板应用,应用地址:ColorfulBox - Microsoft Store 2. 功能 ColorfulBox是Adobe 色轮的简单模仿,只实现了最基本的功能,UI也没那么好看,也没用MVVM框架。
原文: [UWP]分享一个基于HSV色轮的调色板应用

1. 前言

上一篇文章介绍了HSV色轮,这次分享一个基于HSV色轮的调色板应用,应用地址:ColorfulBox - Microsoft Store

img_22f8410636b939173719d69301120ddd.png

2. 功能

ColorfulBox是Adobe 色轮的简单模仿,只实现了最基本的功能,UI也没那么好看,也没用MVVM框架。

2.1 HSV色轮

这个应用最好玩的地方在于分布于HSV色轮上的各个点(ColorPoint)以及可以通过拖动它们改变颜色。ColorPoint的基本结构如下(不是完整代码):

public class ColorPoint : DependencyObject, INotifyPropertyChanged
{

    public event EventHandler<PropertyEventArgs> ColorChanged;
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnColorChanged(Color oldValue, Color newValue)
    {
        ColorChanged?.Invoke(this, new PropertyEventArgs(nameof(Color), oldValue, newValue));
    }


    private Color _color;

    /// <summary>
    /// 获取或设置 Color 的值
    /// </summary>
    public Color Color
    {
        get { return _color; }
        set
        {
            if (_color == value)
                return;

            var oldValue = _color;
            _color = value;
            OnPropertyChanged("Color");
            ColorChanged?.Invoke(this, new PropertyEventArgs(nameof(Color), oldValue, _color));
        }
    }
}

由于Color是一个struct,UWP没办法监视struct的值改变事件,所以才使用ColorPoint来包装Color及其它功能。

色轮本身是一个ListView,这样比直接继承Control少写很多代码,尤其是SelectedItem相关的代码还挺无趣的。虽然色轮从外表看不出是个ListView,改改ControlTemplate,再配合GetContainerForItemOverride()PrepareContainerForItemOverride(DependencyObject element, object item)两个函数,可以让ListView完全改头换面。熟悉XAML的开发者应该都不会对这两个ItemsControl中的关键函数感到陌生。

<Style TargetType="local:HsvWheelColorPalette">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:HsvWheelColorPalette">
                <Grid Background="{TemplateBinding Background}">
                    <Image Source="ms-appx:///Assets/Wheel.png" />
                    <ItemsPresenter />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemContainerStyle"
            Value="{StaticResource HsvWheelColorPointVisualStyle}" />
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <Grid />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
</Style>
protected override DependencyObject GetContainerForItemOverride()
{
    return new ColorPointVisual();
}

protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
    base.PrepareContainerForItemOverride(element, item);
    if (element is ColorPointVisual visual)
    {
        visual.ManipulationStarted -= OnColorPointVisualDragStarted;
        visual.ManipulationStarted += OnColorPointVisualDragStarted;

        visual.ManipulationDelta -= OnColorPointVisualDragDelta;
        visual.ManipulationDelta += OnColorPointVisualDragDelta;
    }

    var colorPoint = item as ColorPoint;
    colorPoint.ColorChanged -= OnColorChanged;
    colorPoint.ColorChanged += OnColorChanged;
}

在UWP中拖动的代码变得很简洁,这次直接在PrepareContainerForItemOverride(DependencyObject element, object item)为ColorPointVisual订阅拖动的事件。至于ColorPointVisual的布局,只需要转换Color为HsvColor,再计算距离中心点的角度(Hue)和距离(Saturation)就可以得出,为了不和ListView的代码耦合,尽量使用Binding:

<TransformGroup>
    <TranslateTransform X="{Binding TranslateX, Source={StaticResource SaturationAndRadiusToTransformXBridge}}" />
    <RotateTransform Angle="{Binding Color, Converter={StaticResource ColorToAngleConverter}}" />
</TransformGroup>

2.2 后续功能

Hsv色轮是整个应用中最有趣的部分,之后只需要按部就班添加各种色彩规则(目前只有Analogous,即类比)和输出的颜色模型。由于开源这个应用的目的是作为一个用于学习的应用,不想添加太多功能让这个项目的代码变得复杂。

2.3 已知的问题

Hsv色轮中各个ColorPoint拖动并不是太平滑,这是因为Hsv颜色只能表示360 * 100 = 36000 种颜色,而Hsv色轮上有πr^2 个像素点,它们之间做不到完全匹配。虽然已经想到解决方案,不过暂时没太大兴致解决。

3. 结语

前面提到ColorfulBox是一个用于学习的应用,不会有太多复杂的技术,暂时连MVVM都不会有。将来添加功能也会很谨慎(主要看心情),希望代码不会膨胀得太夸张吧。

题外话,UWP一直缺少一个ColorPicker控件,而微软将在Fall Update (1709)中提供新的控件ColorPicker,同样基于HSV色轮。等了这么久终于等到了。
img_04f97e4d997a87ff05172a3dce4223aa.png

4. 参考

色论 _ 色彩配置 - Adobe Color CC
操作事件

5. 源码

Colorful-Box

目录
相关文章
|
26天前
|
Android开发 开发者
Android开发之OpenGL的画笔工具GL10
这篇文章简述了OpenGL通过GL10进行三维图形绘制,强调颜色取值范围为0.0到1.0,背景和画笔颜色设置方法;介绍了三维坐标系及与之相关的旋转、平移和缩放操作;最后探讨了坐标矩阵变换,包括设置绘图区域、调整镜头参数和改变观测方位。示例代码展示了如何使用这些方法创建简单的三维立方体。
21 1
Android开发之OpenGL的画笔工具GL10
|
1月前
QT笔刷画笔渲染的使用
QT笔刷画笔渲染的使用
|
7月前
|
计算机视觉 Python
openCV的trackbar调色板
openCV的trackbar调色板
31 1
|
11月前
|
API 图形学
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制(上)
【Win32绘图编程,GDI绘图对象】绘图基础,位图处理,绘图消息处理,画笔,画刷,文本绘制
Photoshop - CMYK 和 RGB 区别是什么?
Photoshop - CMYK 和 RGB 区别是什么?
166 0
Photoshop - CMYK 和 RGB 区别是什么?
|
机器学习/深度学习
【OpenGL】十六、OpenGL 绘制四边形 ( 绘制 GL_QUADS 四边形 )
【OpenGL】十六、OpenGL 绘制四边形 ( 绘制 GL_QUADS 四边形 )
412 0
【OpenGL】十六、OpenGL 绘制四边形 ( 绘制 GL_QUADS 四边形 )
|
机器学习/深度学习 索引 Windows
【OpenGL】十七、OpenGL 绘制四边形 ( 绘制 GL_QUAD_STRIP 模式四边形 )
【OpenGL】十七、OpenGL 绘制四边形 ( 绘制 GL_QUAD_STRIP 模式四边形 )
398 0
【OpenGL】十七、OpenGL 绘制四边形 ( 绘制 GL_QUAD_STRIP 模式四边形 )
Qt-QPalette-调色板学习
Qt-QPalette-调色板学习
110 0
Qt-QPalette-调色板学习
简单的笔刷效果【OpenGL】
简单的笔刷效果【OpenGL】
159 0
简单的笔刷效果【OpenGL】
|
C# 计算机视觉
OpencvSharp 在WPF的Image控件中显示图像
原文:OpencvSharp 在WPF的Image控件中显示图像 1、安装OpencvSharp 我使用的是VS2013 社区版,安装OpencvSharp3.0 在线安装方法:进入Tools,打开NuGet的包管理器 搜索Opencv 安装之后就可以使用,无需再做其他配置。
3943 0