DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: bluewind23
今日帖子: 0
在线用户: 7
导航: 论坛 -> 移动应用开发 斑竹:flyers,iamdream  
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2024/7/7 18:13:28
标题:
请问有没有办法通过调节RGB的值从很浅的蓝色到最深的蓝色过渡 浏览:423
加入我的收藏
楼主: 请问有没有办法通过调节RGB的值从很浅的蓝色到最深的蓝色过渡,中间不能出现其他颜色,有没有一种算法,(如果只调节B中间过渡的颜色会比较黑),谢谢.
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/7/7 19:44:35
1楼: 以下的函数,根据一个从0到1的浮点数值,返回一个从极深蓝(纯黑)到极浅蓝(纯白)过度的颜色

function GetBlueColor(value : double):TColor;
begin
  if Value<0 then Value := 0
  else if Value >1 then Value := 1;
  if Value<=0.11 then Result := round(Value*151924363) and $ff0000
  else Result:=round(Value*286.5-31.5) and $ff * $101 + $ff0000;
end;
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2024/7/7 21:58:38
2楼: 谢谢,但是这个方法跟我makecolor(0, 0 ,value)只改变value效果是一样的,一开始还是比较黑,不是从浅蓝开始到深蓝结束这样变化的.
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/7 22:36:36
3楼: 这个如果你自己调,需要懂伽马曲线。

当然,你可以不用自己调,去网上找一个配色的图谱,把它整个从深到浅的过程,中间取几个采样点,你就知道 RGB 值了。

其实你要的不是蓝色从深到浅,中间的蓝色它不是纯蓝色。但你又无法说清楚你要的蓝色是哪种。
----------------------------------------------
-
作者:
男 thinknet (thinknet) ★☆☆☆☆ -
盒子活跃会员
2024/7/7 23:13:42
4楼: 要在Delphi中实现从浅蓝色到深蓝色的平滑过渡,您可以调整RGB值中的蓝色和绿色分量,而保持红色分量为0。这样可以避免过渡过程中出现其他颜色。以下是一个简单的算法示例:

定义起始颜色和结束颜色。
计算颜色过渡的步数。
使用循环来生成过渡颜色。
这里有一个示例代码展示如何实现这个算法:

program ColorTransition;

uses
  Graphics, Forms, Controls;

procedure GenerateColorTransition(FromColor, ToColor: TColor; Steps: Integer);
var
  i: Integer;
  r1, g1, b1: Byte;
  r2, g2, b2: Byte;
  r, g, b: Byte;
  DeltaR, DeltaG, DeltaB: Single;
  NewColor: TColor;
begin
  // 提取起始颜色的RGB分量
  r1 := GetRValue(FromColor);
  g1 := GetGValue(FromColor);
  b1 := GetBValue(FromColor);

  // 提取结束颜色的RGB分量
  r2 := GetRValue(ToColor);
  g2 := GetGValue(ToColor);
  b2 := GetBValue(ToColor);

  // 计算每一步的变化量
  DeltaR := (r2 - r1) / Steps;
  DeltaG := (g2 - g1) / Steps;
  DeltaB := (b2 - b1) / Steps;

  // 生成过渡颜色
  for i := 0 to Steps do
  begin
    r := Round(r1 + DeltaR * i);
    g := Round(g1 + DeltaG * i);
    b := Round(b1 + DeltaB * i);
    NewColor := RGB(r, g, b);
    // 这里可以将NewColor用作需要的用途,例如绘制到画布上
    // Canvas.Brush.Color := NewColor;
    // Canvas.FillRect(Rect(0, i * 10, 100, (i + 1) * 10));
  end;
end;

begin
  Application.Initialize;
  Application.CreateForm(TForm, Form1);
  Form1.Canvas.Brush.Color := clWhite;
  Form1.Canvas.FillRect(Rect(0, 0, Form1.Width, Form1.Height));
  GenerateColorTransition(clSkyBlue, clNavy, 100);
  Application.Run;
end.

在这个示例中,起始颜色为 clSkyBlue(浅蓝色),结束颜色为 clNavy(深蓝色),通过100步进行过渡。您可以根据需要调整 Steps 的值来控制过渡的平滑度。此算法通过线性插值来计算每一步的颜色值,并避免了过渡过程中出现其他颜色。
==========
以上代码chatGPT生成,未验证,参考下
----------------------------------------------
-
作者:
男 thinknet (thinknet) ★☆☆☆☆ -
盒子活跃会员
2024/7/7 23:37:03
5楼: 继续问:有没有更高级更精确的算法?
答:
当然,有更高级和更精确的算法来实现颜色过渡。在计算机图形学中,色彩空间的选择对于颜色过渡的效果至关重要。RGB空间的线性插值可能会导致不均匀的过渡,因为人眼对颜色的感知并非线性。

一种更高级的方法是使用CIELAB色彩空间(Lab色彩空间)。CIELAB色彩空间是基于人类视觉感知的颜色模型,适用于进行颜色的插值和过渡。我们可以先将RGB颜色转换为Lab颜色,然后在Lab空间进行插值,最后将Lab颜色转换回RGB。

下面是一个使用CIELAB色彩空间进行颜色过渡的示例:

1. 将RGB颜色转换为CIELAB颜色。
2. 在CIELAB色彩空间中进行线性插值。
3. 将插值后的CIELAB颜色转换回RGB。

以下是示例代码:

==========
代码发不了,说是有敏感文字,所以做成了附件(见附件)
==========

这个示例中使用了RGB与CIELAB之间的转换函数,并在CIELAB空间中进行插值,然后将结果转换回RGB。这样可以生成更平滑和更符合人眼感知的颜色过渡。
==========**********==========
以上内容均由chatGPT生成,未经验证,仅供参考
此帖子包含附件:thinknet_20247723373.txt 大小:3,754B
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2024/7/8 0:50:31
6楼: @pcplayer 确实 还是采样比较省事
@thinknet GPT的代码经常没法用,比如这个GetRValue不知道在哪个命名空间,我需要fmx的,而且它是搞成等差数列,应该没这么简单.
----------------------------------------------
-
作者:
男 kenliaoliao (ben) ★☆☆☆☆ -
普通会员
2024/7/8 8:18:05
7楼: 支持一下,顶
----------------------------------------------
-
作者:
男 kentty (kentty) ★☆☆☆☆ -
普通会员
2024/7/8 8:29:03
8楼: 搭车请教一个问题
有时候在画曲线图的时候,需要动态生成十几条曲线
希望这些曲线的颜色有明显的区分性
一直没有很好的算法来挑出”有明显区分性”的颜色值
没办法只好在网上找一些颜色值做成备用的颜色数列

不知道计算机图形学上有没有相应的算法
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/7/8 10:31:03
9楼: @mp654kk 我的方法就是最完美的方法
传进去的参数就是亮度值,你可以获得从纯黑到纯白之间任意指定亮度值的可能获取到的最纯的蓝色。

基本原理就是输入亮度,锁定色相为纯蓝,然后在RGB空间内获取尽可能高的纯度

不明白你为什么会觉得这方法回和你自己的一样
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/7/8 10:42:45
10楼: @kentty, RGB中选定其中一个值指定为255,再在剩下两种颜色之中,选定一个指定值为0,你可以获得6种区别度非常大的颜色,然后剩下的一个色彩,按照你须要的色彩总数将它分段,例如你须要大约20种颜色,则可以分为0,85,170,255四档,乘以6种颜色选择方案,你就有了24种色彩,扣除其中6种重复的,加上黑白色,总共就有了20种色彩选择
----------------------------------------------
-
作者:
男 pcplayer (pcplayer) ★☆☆☆☆ -
普通会员
2024/7/8 11:33:55
11楼: 5楼里面 ChatGPT 说:RGB空间的线性插值可能会导致不均匀的过渡,因为人眼对颜色的感知并非线性。

这个非线性,就是所谓的伽马曲线。
所以,不能在 RGB 上做线性的调整来做渐变。

-----
8 楼:颜色理论,对位色。比如绿-红,蓝-橙,蓝-红,黄-绿,等等。这个是有颜色理论的,也是有公式的。有公式的意思就是你可以在程序里面通过计算获得。

当然,实在不想计算,事先准备一些颜色,查表也是可以的嘛。
----------------------------------------------
-
作者:
男 zhaoyf (zyf) ★☆☆☆☆ -
普通会员
2024/7/8 15:53:12
12楼: B设为128左右,R,G设为0 (初始时的深蓝)
然后单独加B。   R,G不变
B加到255时,B不变,同步增加R和G
这样应该是平缓过渡的蓝色
----------------------------------------------
-
作者:
男 mp654kk (mp654kk) ▲△△△△ -
普通会员
2024/7/8 17:37:19
13楼: @roadrunner 您的方法,我每次加0.01试出来是从黑色变到红色不知是不是这样.
@pcplayer 好像不用这么复杂,按zhaoyf的方法我试了一下效果还是不错的.
@zhaoyf 神奇了,从深蓝到浅蓝变化了,佩服佩服.
谢谢各位高手
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/7/8 18:53:02
14楼: TColor是VCL的颜色值,变成红色了,你将得到的颜色的R和B的通道交换一下就是
----------------------------------------------
-
作者:
男 roadrunner (roadrunner) ★☆☆☆☆ -
盒子活跃会员
2024/7/8 18:56:48
15楼: @pcplayer 伽马矫正是显示设备的任务,理论上归操作系统管

就算你要实现自己的伽马矫正逻辑,也是须要在每一台设备中测量得到伽马值,然后在显示的最后一步再作修正,这和计算色彩值应该是解耦的
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行30.0293毫秒 RSS