Adobe 颜色选取器克隆






4.96/5 (31投票s)
一个简单但功能强大的 .NET 颜色选择器对话框。
引言
任何使用 Adobe(R) Photoshop 的人都知道它非常强大的颜色选择器对话框,它远远超出了 Windows 过时的原生颜色对话框的功能。
有人可能会说,Windows 的那个做得很好。但是,尤其是在创建处理图形或绘画的应用程序时,我们可能希望在选择器中拥有一些特殊功能,例如
- 可以选择不同的颜色模型
- 内部精确颜色模型
- 图形选择器控件,可与文本可编辑值字段同步
- 轻松快速转换
- 屏幕外选择器
- 将十六进制代码复制到剪贴板
- 重置为前一个颜色
- 添加到颜色表
每当您编写图形应用程序时,都应牢记用户可能希望保留他们的颜色和颜色主题,而不管他们输入的是哪种颜色模型。这意味着,HSL 颜色必须以与 La*b* 颜色相同的方式存储。
因此,我编写了这组颜色选择控件,并将它们组合成一个颜色选择对话框,其灵感来自 Adobe 的。我无法重现 LAB 部分中的确切值,因为它们似乎使用了另一种加权格式,该格式基于光谱的白点。
内部设计
ColorSelectionModule
此选择器的主要目标是支持不同的颜色模型。因此,必须记住所有选择控件都必须支持通用接口。这是通过 ColorSelectionModule
类实现的。它是一个抽象类,每个继承它的类都提供以下属性:
ColorSelectionFader
,用于滚动颜色模型的选定参数ColorSelectionPlane
,用于滚动颜色模型的其余参数XYZ
,用于获取或设置选定的颜色
ColorSelectionModule
协调 fader 和 plane 的更新。例如,如果滚动 fader,plane 的图像必须更改,反之亦然。同样,如果更改选定的颜色,两者都必须更改。
颜色空间
选择器的核心是作为 ColorSelectionModule
基础的颜色空间。XYZ 或以前的 CIEXYZ 用作内部格式,因为它具有浮点强度,并包含所有其他光谱。LAB 是 XYZ 空间的加权派生,它基本上源自 RGB,就像 HSV 和 CMYK 一样。
每个颜色空间只能转换为链中的下一个。有关详细规范和官方转换算法,请访问 EasyRGB.com。
本文的 **主要目标** 是提供一个有用的颜色对话框,而不是解释颜色模型。如果您想进一步了解,请参阅这篇精彩的文章:Manipulating colors in .NET(在 .NET 中操作颜色)。
从屏幕拾色
如果您编写光栅图形编辑器,您肯定希望能够从文档中拾取颜色。这可以通过一个工具来实现,更本地化地说,一个在屏幕上发生的每一次鼠标移动时被调用的委托。能够在屏幕区域的任何位置拾取颜色,一方面更灵活,因为您可以从其他应用程序拾取颜色,另一方面,它可能会更容易出错,例如,您可能会遇到文档或其他窗口中的网格线。
代码涉及基本的 Win32 API,它提供了一种相对简单的方法来从 HDC 复制颜色。
// functions
[DllImport("user32.dll")]
private static extern IntPtr GetDC(IntPtr hwnd);
[DllImport("user32.dll")]
private static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
[DllImport("gdi32.dll")]
private static extern int GetPixel(IntPtr hdc, int x, int y);
/// <summary>
/// returns the color of any location on the screen
/// </summary>
public static Color GetScreenPixel(int x, int y)
{
IntPtr descdc=GetDC(IntPtr.Zero);
Color res=ColorTranslator.FromWin32(GetPixel(descdc,x,y));
ReleaseDC(IntPtr.Zero,descdc);
return res;
}
此功能封装在 ColorLabel
控件中,该控件还管理 Hexcode 绘制和先前颜色比较。
打包工具
最后,我们将不同的控件组合在一个窗体上,可以将其直接用于代码中。但是,我们也应该能够以与基本 .NET / Windows 颜色对话框相同的方式使用它。因此,添加了一个名为 ColorDialogEx
的类,它继承自 Component
。如果将其从工具箱拖放到应用程序的窗体上,它将自动固定到组件区域,并且可以通过 Color
属性(用于获取或设置 System.Drawing.Color
)从代码中访问。
通过颜色标签上的上下文菜单可以访问高级功能,例如从屏幕拾色、将颜色的十六进制代码复制到剪贴板、返回到先前选定的颜色或选择 L\*a\*b\* 颜色模型。此外,在拖动选择平面/fader 时按住 Shift 键将显示一个网格,选择点将吸附到该网格。可能有更明显地显示这些功能的方法,但我选择添加工具提示帮助。
结论
最后,我希望这个组件对于任何在其应用程序中处理颜色管理的人来说都很有用。DrawingEx
命名空间中还有一些其他工具,例如颜色按钮、带量化器的 32 bpp 真彩色图标编码器,以及一些 3D 辅助类。很快,还将有一个类似于 Adobe Illustrator 的渐变选择器工具,这样我们在从 Adobe 产品切换时就不必重新学习与应用程序的交互了。