加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 我的彩虹拾色器不能正确饱和,我错过了什么/做错了什么?

发布时间:2020-12-15 05:41:29 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个类似于MS Paint的拾色器. 不幸的是,我无法弄清楚饱和算法. 每当我尝试实现饱和度时,它都不会正确饱和. 我不得不对算法中的饱和效应有所了解. 这是我当前的算法创建的. 无论何时我尝试在Y轴上执行饱和效果,它只会使第一行之后的所有内容完
我正在尝试创建一个类似于MS Paint的拾色器.
不幸的是,我无法弄清楚饱和算法.
每当我尝试实现饱和度时,它都不会正确饱和.
我不得不对算法中的饱和效应有所了解.

这是我当前的算法创建的.
无论何时我尝试在Y轴上执行饱和效果,它只会使第一行之后的所有内容完全变为红色或黑色.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SFML;
using SFML.Graphics;
using SFML.Window;

namespace Source
{
   public ColorWheel()
    {
        for (int y = 0; y < 255; y++)
        {
            for (int z = 0; z < 6; z++)
            {
                for (int x = 0; x < 255; x++)
                {
                    uint ux = (uint)x;
                    uint uy = (uint)y;
                    uint uz = (uint)z;
                    ux = ux + (uz * 255);
                    image.SetPixel(ux,uy,color);

                    //Red 255 - Green 0-254
                    if (z == 0)
                    {
                        color.G += 1;
                    }
                    //Green 255 - Red 255-0
                    else if (z == 1)
                    {
                        color.R -= 1;
                    }
                    //Green 255 - Blue 0-255
                    else if (z == 2)
                    {
                        color.B += 1;
                    }
                    //Blue 255 - Green 255-0
                    else if (z == 3)
                    {
                        color.G -= 1;

                    }
                    //Blue 255 - Red 0-255
                    else if (z == 4)
                    {
                        color.R += 1;
                    }
                    //Red 255 - Blue 255-0
                    else if (z == 5)
                    {
                        color.B -= 1;
                    }

        Texture texture = new Texture(image);
        sprite.Texture = texture;
    }

    public void Update(double dt)
    {
    }

    public void Render(RenderWindow rWindow)
    {
        rWindow.Draw(sprite);
    }

}

}

解决方法

我发现这是一个非常有趣的挑战.花了我一会儿,但我想我想通了.棘手的部分显然意识到,在第1行,颜色介于255和0之间,每个连续的行都有较少的颜色(因为它们慢慢混合为白色).

因此,在第10行,你有255个像素,可用245种颜色填充它们.无论如何,这是代码:

for (int y = 0; y < 255; y++)
        {
            color = new Color((255),y,y);
            for (int z = 0; z < 6; z++)
            {
                for (int x = 0; x < 255; x++)
                {
                    float colorDif = (255 / ((float)255 - y));
                    uint ux = (uint)x;
                    uint uy = (uint)y;
                    uint uz = (uint)z;
                    ux = ux + (uz * 255);
                    image.SetPixel(ux,color);

                    if (x >= lastX + colorDif)
                    {
                        //Red 255 - Green 0-254
                        if (z == 0)
                        {
                            if (color.G < (255))
                                color.G += 1;
                        }
                        //Green 255 - Red 255-0
                        else if (z == 1)
                        {
                            if (color.R > y)
                                color.R -= 1;
                        }
                        //Green 255 - Blue 0-255
                        else if (z == 2)
                        {
                            if (color.B < (255))
                                color.B += 1;
                        }
                        //Blue 255 - Green 255-0
                        else if (z == 3)
                        {
                            if (color.G > y)
                                color.G -= 1;
                        }
                        //Blue 255 - Red 0-255
                        else if (z == 4)
                        {
                            if (color.R < (255))
                                color.R += 1;
                        }
                        //Red 255 - Blue 255-0
                        else if (z == 5)
                        {
                            if (color.B > y)
                                color.B -= 1;
                        }
                        lastX += colorDif;
                    }
                }
                lastX = 0;
            }
        }

对我来说似乎工作得很好,但如果有任何问题,lemme知道,我会再看看它.希望能帮助到你!

编辑:稍微进一步解释,以防万一.这样做的目的是使颜色从全彩色变为白色(这就是改变饱和度所做的).但是,如果这不是你的意思,还有另外两个变化也应该起作用.

如果您希望将它们全部混合为黑色,则需要更改的是从y到0的最小颜色以及从255到255-y的最大颜色.

你也可以混合成灰色,在这种情况下你需要max为255-y,min为y和colorDif =(255 /((float)255 – 2 * y)); (注意2 *).然而,灰色,你只会得到127行颜色,而不是255行.如果这没有意义,我可以尝试进一步解释:P

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读