c# – 我的彩虹拾色器不能正确饱和,我错过了什么/做错了什么?
发布时间:2020-12-15 05:41:29 所属栏目:百科 来源:网络整理
导读:我正在尝试创建一个类似于MS Paint的拾色器. 不幸的是,我无法弄清楚饱和算法. 每当我尝试实现饱和度时,它都不会正确饱和. 我不得不对算法中的饱和效应有所了解. 这是我当前的算法创建的. 无论何时我尝试在Y轴上执行饱和效果,它只会使第一行之后的所有内容完
我正在尝试创建一个类似于MS Paint的拾色器.
不幸的是,我无法弄清楚饱和算法. 每当我尝试实现饱和度时,它都不会正确饱和. 我不得不对算法中的饱和效应有所了解. 这是我当前的算法创建的. 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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |