.net - 以编程方式创建的拾色器图像 .NET?

标签 .net wpf color-picker

是否存在任何算法来创建编程图像,然后用作颜色选择控件的基础?

如果您知道有关此主题的文档或代码的一些有用来源,欢迎他们。

编辑:我的想法是创建一个 WPF 选择器控件,我知道已经有一些用于 WPF,Sacha's one ,或来自 Microsoft Sample 的那个.这个问题的重点不是太面向我稍后将使用的技术,而是面向创建图像的算法

EDIT2:我想以编程方式在正方形中创建类似渐变图像的东西。

alt text http://patterns.holehan.org/uploads/gimp_color_chooser.png

最佳答案

这里有一些可能性:

  1. 使用重叠的线性渐变画笔创建图像。
  2. 将图像创建为位图。
  3. 在渲染过程中使用像素着色器创建图像。

重叠渐变画笔

对于您显示的图像,您可以通过使用以下方式实现所需的效果:

<Grid>
  <Rectangle>
    <Rectangle.Fill>
      <LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
        <GradientStop Offset="0" Color="#FFFF8040" />
        <GradientStop Offset="1" Color="#FFFFFFFF" />
      </LinearGradientBrush>
    </Rectangle.Fill>
  </Rectangle>
  <Rectangle>
    <Rectangle.Fill>
      <LinearGradientBrush StartPoint="0,0" EndPoint="1,0">
        <GradientStop Offset="0" Color="#FF000000" />
        <GradientStop Offset="1" Color="#00000000" />
      </LinearGradientBrush>
    </Rectangle.Fill>
  </Rectangle>
</Grid>

第一次填充设置颜色,第二次填充使颜色变暗。显然,这可以在绘图或 VisualBrush 中完成。

这是最简单的解决方案,但它产生的结果有限。

将图像创建为位图

使用位图可以,但与分辨率无关。您需要选择创建位图的分辨率。如果您选择的分辨率太低,质量会很差。如果您选择太高的分辨率,则会浪费资源。根据屏幕分辨率和变换自动选择分辨率虽然困难但可行:您必须订阅多个事件以检测分辨率更改并在目标上使用 TransformToDevice 以确定从 WPF 坐标到设备坐标的变换。

一旦您决定了位图的分辨率,剩下的就很简单了:

uint[] pixels = new uint[width*height];
for(int x=0; x<width; x++)
  for(int y=0; y<height; y++)
    pixels[y*width + x] = ComputeColor(x, y);

var bitmap = new WritableBitmap(width, height, 96, 96, PixelFormat.Pbgra32, null);
bitmap.WritePixels(new Rect(0, 0, width, height), pixels, width*4, 0);

使用像素着色器

像素着色器实际上在 GPU 内部运行,并且它们针对每个像素运行。他们已经知道目标分辨率,因此颜色计算很容易。困难在于您不能用 C# 或 VB.NET 编写算法:您必须用高级着色器语言 (HLSL) 编写它,这可能是一个重要的学习曲线。

以下是一些包含自定义着色器示例的网站:

Pixel shaders and silverlight WPF 像素着色器效果库 Interactive example

关于.net - 以编程方式创建的拾色器图像 .NET?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2357617/

相关文章:

javascript - 在 Magnific Popup 插件中使用时,无法从 Spectrum Colorpicker 插件中的文本框复制颜色

c# - ToUpper() 方法不起作用

.net - 如何可靠地检测实际安装的.NET 4.5版本?

c# - 异常加载 CEFSHARP.CORE.DLL

c# - 如何在代码隐藏中将自定义属性从 View 绑定(bind)到 ViewModel?

javascript - D3 : Bar chart coloring

.net - .NET 的哪些部分需要管理权限才能执行?

.net - F#中的异步等待

c# - 单选按钮验证

javascript - 一个好的 javascript/jquery 配色方案生成器(如 kuler)