【问题标题】:How to create a screen image from TColors and intensities (in Delphi)如何从 TColors 和强度创建屏幕图像(在 Delphi 中)
【发布时间】:2010-09-14 15:43:28
【问题描述】:

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

我想将此数值数据转换为如下图底部所示的图形视图。

但是,我从未在 Delphi (2010) 中使用 Canvas、TImage、位图或任何我可以将其显示在屏幕上的方式进行任何操作。

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

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

提前致谢。

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

Convert light frequency to RGB?

【问题讨论】:

    标签: delphi graphics colors


    【解决方案1】:

    嗯,在我看来,您的波长是色调,而您的强度是亮度的另一个词。如果只有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。因此,将光谱从红色变为蓝色——再次记住,红色是 LOW,而不是 HIGH——并将其归一化到 0--192 的范围(或任何实际的高值),你就得到了 H 值。

    此外,如果您的颜色线的右端有一些颜色从全红色变为紫色一点,那么您将有一个负色调,它会回到 255。

    【讨论】:

    • 我实际上有一个函数(在非常好的 SDL 组件库中)将 HSI 转换为 RGB:procedure HSItoRGB (Hue, Sat, Intens: double; var r, g, b: integer);所以我现在的问题是如何从 WaveLength 转到 HSI?!
    • 其实很简单。找出波长0和色调0之间的差异,然后将x轴归一化到0..255的范围内,这就是你的H。将Y轴归一化为0..255,这就是你的L.S总是255 , 以产生您的示例显示的明亮、鲜艳的颜色。
    • 谢谢,梅森!仍然不确定如何将波长(或光的频率)映射到色调......
    • 您添加到问题的最后一个链接正好涵盖了该主题,罗伯特。 The second most popular answer there 甚至链接到 a page with Delphi code and a demo program。你有什么困难?如果是代码从波长转换为 RGB,而您只需要色调,则从 RGB 转换为 HSI,取 H 值,应用您的 I 值,然后再转换回 RGB。
    • @Robert:添加了关于如何将波长映射到色调的基本说明。
    【解决方案2】:

    您在 efg 的 Delphi library 中拥有您所需要的。
    但是您确实应该首先阅读有关可见光光谱的文章:Spectra
    “该程序的目的是显示 RGB 颜色作为可见光(380 到 780 nm)波长的函数。”

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

    【讨论】:

      猜你喜欢
      • 2011-03-06
      • 2011-10-18
      • 1970-01-01
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      相关资源
      最近更新 更多