代码之家  ›  专栏  ›  技术社区  ›  Drake

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

  •  3
  • Drake  · 技术社区  · 15 年前

    确实存在 算法 创造 以编程方式 图像,用于颜色选择控件的基础?

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

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

    edit2:我想用编程的方法在正方形中创建类似渐变图像的东西。

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

    1 回复  |  直到 15 年前
        1
  •  3
  •   Ray Burns    15 年前

    以下是一些可能性:

    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>
    

    第一个填充设置颜色,第二个填充使颜色变暗。很明显,这可以在绘图或可视化画笔中完成。

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

    将图像创建为位图

    使用位图可以工作,但与分辨率无关。您需要选择创建位图的分辨率。如果你选择的分辨率太低,你的质量就会很差。如果你选择的分辨率太高,你会浪费资源。根据屏幕分辨率和转换自动选择分辨率是困难的,但也是可能的:必须订阅多个事件以检测分辨率更改,并在目标上使用transform to device来确定从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