以编程方式.NET创建的颜色选择器图像?

时间:2010-03-01 17:12:40

标签: .net wpf color-picker

是否存在任何算法来创建以编程方式图像,然后使用颜色拾取控件的基础?

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

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

EDIT2:我想以编程方式在广场上创建渐变图像。

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

1 个答案:

答案 0 :(得分:3)

以下是一些可能性:

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

    对于您展示的图像,您可以通过使用以下内容来实现所需的效果:

    <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>
    

    第一个填充设置颜色,第二个填充使颜色变暗。显然,这可以在Drawing或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