为了账号安全,请及时绑定邮箱和手机立即绑定

根据值获取渐变内的颜色值

根据值获取渐变内的颜色值

C#
德玛西亚99 2022-12-04 13:05:34
假设我有以下渐变:开始 (0):绿色 (0, 255, 0)中心 (0.5):橙色 (255, 165, 0)结束 (1):红色 (255, 0, 0)现在是否有计算或现有函数可以根据每秒变化的值从该渐变中读取颜色值?作为我的一个想法:例如,可以在 Photoshop 中创建一个图像,比如说 100 像素宽和 1 像素高。现在我用上面提到的值和点在整个表面上放置一个颜色渐变。我想要获取颜色的值也仅在 int 值 0 和 100 之间。因此我可以将此图像加载到一个变量左右(不在 UI 中显示它)并根据我的值获取颜色使用“GetPixel”函数,所以如果值为 50,我会得到橙色,因为图像中的第 50 个像素对应于橙色。这将是一种合理且(理论上)易于编程的可能性。但是现在这个值每秒都在变化。而且我想我在某处读到 GetPixel 函数相对较慢。当然我现在就可以把它编程出来(出于测试目的我可能会在之后做),但在我看来它非常耗费资源。有更好的选择吗?
查看完整描述

1 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

这是用于保存颜色的 RGB 空间中颜色之间的简单线性插值System.Drawing.Color:


public int LinearInterp(int start, int end, double percentage) => start + (int)Math.Round(percentage * (end - start));

public Color ColorInterp(Color start, Color end, double percentage) =>

    Color.FromArgb(LinearInterp(start.A, end.A, percentage),

                   LinearInterp(start.R, end.R, percentage),

                   LinearInterp(start.G, end.G, percentage),

                   LinearInterp(start.B, end.B, percentage));

public Color GradientPick(double percentage, Color Start, Color Center, Color End) {

    if (percentage < 0.5)

        return ColorInterp(Start, Center, percentage / 0.5);

    else if (percentage == 0.5)

        return Center;

    else

        return ColorInterp(Center, End, (percentage - 0.5)/0.5);

}

你会像这样使用它:


var Start = Color.FromArgb(255, 0, 255, 0);

var Center = Color.FromArgb(255, 255, 165, 0);

var End = Color.FromArgb(255, 255, 0, 0);


var Pick = GradientPick(0.75, Start, Center, End);


查看完整回答
反对 回复 2022-12-04
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号