如何从TColors和强度创建屏幕图像(在Delphi中)

时间:2010-09-14 15:43:28

标签: delphi graphics colors

我有一个(光谱图)数据集波长(x轴)和强度(y轴,任意单位,可以有不同的范围......)

我想将此数字数据转换为图形视图,如下图所示。

但是,我从来没有在Delphi(2010)中使用Canvas,TImages,位图或者我在屏幕上看到的任何方式做任何事情。

(显然,如果我可以将数据转换为一行图像像素,那么我只需根据需要将该行复制多次以获得所需的图像高度。)

有人能指出我正确的方向或提供遍历x,y值的样本代码,创建彩色图像吗?我希望我的解决方案能让我(或用户)调整水平(对比度,亮度)。

提前致谢。

alt text

相关SO帖子:Algorithm to convert any positive integer to an RGB value

Convert light frequency to RGB?

2 个答案:

答案 0 :(得分:2)

嗯,在我看来,你的波长是色调,你的强度是亮度的另一个词。如果只有a model that represents colors in terms of hue and brightness和一种在它和RGB之间进行转换的方法,那么获得正确的颜色将是一项非常简单的任务......: - )

显示颜色实际上非常简单。您可以在表单上使用标准TImage组件。一旦你弄清楚TColor值在某个位置的位置,你可以用

设置它

image.Canvas.Pixels[x, y] := aColor;

编辑:如何将波长映射到色调:

这有点棘手,因为光谱的左侧似乎是紫色,右侧是红色。在HSL中,红色位于0位置。您将不得不反转X轴,因此红色为0,紫色为高。你可以通过基本上说value := MAX_VALUE - value;

来得到这个

然后你需要校准线。将对应于全红的波长设置为等于0,将远蓝色端设置为等于其对应色调的波长。 (如果你可以将波长转换为TColor,然后将TColor转换为HSL,这应该是难以计算的。)这是你的范围,你需要将所有波长标准化以适应该范围。

只要注视它,它就像我的示例光谱的左端在色轮上的大约270度色调,相当于在0-255的等级上的192。因此,将光谱从红色变为蓝色 - 再次,记住红色是低电平,而不是高电平 - 并将其标准化为0--192(或任何实际高值)并且您已获得H值。 / p>

另外,如果你的颜色线的右端有一些颜色超过红色到紫色,那么你会有一个负色调,它会回到255.

答案 1 :(得分:1)

您从{efg。的Delphi library获得了所需的内容 但你真的应该首先阅读关于可见光谱的文章:Spectra “此程序的目的是显示RGB颜色作为可见光(380至780 nm)波长的函数。”

您必须添加的唯一修改是调整强度。但正如梅森所说,通过HSI表示可以很容易地调整强度:因此,一旦你从波长获得RGB,转换为HSI,快速的解决方案就是调整I而不是转换回RGB。