是否存在任何算法来创建以编程方式图像,然后使用颜色拾取控件的基础?
如果您知道有关此主题的文档或代码的一些有用来源,欢迎使用。
编辑:我的想法是创建一个WPF选择器控件,我知道已经有一些用于WPF,Sacha's one或来自Microsoft Sample的一个。这个问题的重点不是我将在以后使用的技术,而是用于创建图像的算法。EDIT2:我想以编程方式在广场上创建渐变图像。
alt text http://patterns.holehan.org/uploads/gimp_color_chooser.png
答案 0 :(得分: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>
第一个填充设置颜色,第二个填充使颜色变暗。显然,这可以在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