如何根据颜色和亮度创建屏幕图像(在Delphi中)

如何根据颜色和亮度创建屏幕图像(在Delphi中),delphi,graphics,colors,Delphi,Graphics,Colors,我有一个波长(x轴)和强度(y轴,任意单位,可以有不同的范围…)的(光谱剖面)数据集 我想将这些数字数据转换为下图底部所示的图形视图 但是,在Delphi(2010)中,我从来没有用Canvas、TImages、位图或其他任何方式将其显示在屏幕上 (显然,如果我可以将数据转换为一行图像像素,那么我只需根据需要复制该行,以获得所需的图像高度。) 谁能给我指出正确的方向,或者提供遍历x,y值的示例代码,创建彩色图像?我希望我的解决方案能让我(或用户)调整水平(对比度、亮度) 提前谢谢 相关SO员额

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

我想将这些数字数据转换为下图底部所示的图形视图

但是,在Delphi(2010)中,我从来没有用Canvas、TImages、位图或其他任何方式将其显示在屏幕上

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

谁能给我指出正确的方向,或者提供遍历x,y值的示例代码,创建彩色图像?我希望我的解决方案能让我(或用户)调整水平(对比度、亮度)

提前谢谢

相关SO员额:


嗯,在我看来,你的波长是色调,你的强度是亮度的另一个词。获得正确的颜色将是一个非常简单的任务,只要你有一个在它和RGB之间转换的方法…:-)

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

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

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

这有点棘手,因为你光谱的左侧似乎是紫色,而右侧是红色。在HSL中,红色处于0位置。你必须反转你的X轴,使红色为0,紫色为高。基本上,你可以说
value:=MAX\u value-value

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

只要看一下,在我看来,你的示例光谱的左端在色轮上的色调大约为270度,在0-255的刻度上等于192度。所以,把你的光谱从红色到蓝色,记住红色是低的,而不是高的,然后把它标准化到0-192的范围(或者不管实际的高值是什么),你就得到了你的H值


此外,如果在颜色线的右端有一些颜色从全红变为紫色,则会有一个负色调,它会卷回255。

您完全可以从efg获得所需的颜色。
但你真的应该先读一读关于可见光谱的文章:。
“该程序的目的是显示RGB颜色作为可见光波长(380至780 nm)的函数。”


唯一需要添加的修改是调整强度。但正如梅森所建议的,通过HSI表示可以很容易地调整强度:因此,一个快速的“n”脏解决方案是,一旦你从波长获得RGB,转换为HSI,调整I,然后再转换回RGB。

我实际上有一个函数(在非常好的SDL组件库中)可以将HSI转换为RGB:procedure HSItoRGB(色调、饱和度、强度:双精度;变量r、g、b:整数);所以我现在的问题是如何从波长到HSI?!其实很简单。找出波长0和色调0之间的差异,然后将x轴规格化为0..255的范围,这就是你的H。将Y轴规格化为0..255,这就是你的L.s总是255,以产生你的例子所显示的明亮、充满活力的颜色。谢谢,Mason!仍然不确定如何映射波长(或光的频率)但要使用色调…您添加到问题的最后一个链接正好涵盖了该主题,Robert。甚至链接到。您有什么困难?如果代码从波长转换为RGB,您只需要使用色调,然后从RGB转换为HSI,取H值,应用I值,然后再转换回RGB。@Robert:添加了一个基本解释如何将波长映射到色调的详细说明。