Algorithm 如何找到开始颜色以执行颜色混合操作

Algorithm 如何找到开始颜色以执行颜色混合操作,algorithm,colors,Algorithm,Colors,我试图遵循以下原则: 为了能够混合到c0,每个通道的c1必须小于或等于c0。例如,随机较小颜色: r1 = (Random(256)*r0)>>8; g1 = (Random(256)*g0)>>8; b1 = (Random(256)*b0)>>8; 假设你有一个颜色00aa00。你想知道什么颜色混合形成这种颜色。这个答案的方法是生成一个随机初始颜色(“第一混合值”),该颜色的所有RGB通道都小于00aa00input/start值。但是我想对第一个混合值

我试图遵循以下原则:

为了能够混合到c0,每个通道的c1必须小于或等于c0。例如,随机较小颜色:

r1 = (Random(256)*r0)>>8;
g1 = (Random(256)*g0)>>8;
b1 = (Random(256)*b0)>>8;
假设你有一个颜色
00aa00
。你想知道什么颜色混合形成这种颜色。这个答案的方法是生成一个随机初始颜色(“第一混合值”),该颜色的所有RGB通道都小于
00aa00
input/start值。但是我想对第一个混合值有更多的控制。我想让我们生成一个调色板的颜色,说使用这样的颜色很好地融合在一起。然后,我将使用这些颜色中的一种作为第一个混合值,并按照方程得到第二个混合值,该值组合为
00aa00
。就这么简单

但问题是我不知道如何计算调色板中哪些颜色的RGB通道都小于输入值。我可以使用tinycolor之类的库将十六进制转换为RGB没有问题,但我不知道如何定义我使用的调色板,使它们全部(或至少部分)符合所有RGB通道小于输入值的模式


想知道是否有人可以演示如何做到这一点或解释它是如何工作的。如何生成调色板,使调色板中的所有或大部分颜色都符合其RGB通道都小于输入值的RGB通道的约束。

最简单的方法是直接将顺序索引映射到颜色c1

对于所有颜色,只需使用增量(就像bignum算术中的增量,其中通道是一个数字)

如果你想突出一些颜色,那么计算每个使用的通道可用值计数的顺序模。。。在C++/VCL中类似的内容:

/$$----表格CPP----
//---------------------------------------------------------------------------
#包括
#布拉格语hdrstop
#包括“win_main.h”
//---------------------------------------------------------------------------
#pragma包(智能初始化)
#pragma资源“*.dfm”
TForm1*Form1;
int xs=0,ys=0;//决议
图形::TBitmap*bmp=NULL;//回屏缓冲器
//---------------------------------------------------------------------------
常数int _r=2;//通道顺序
常数int_g=1;
常数int_b=0;
常数int_a=3;
联合色
{
字节db[4];//通道访问
DWORD dd;//所有32位颜色
};
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent*Owner):TForm(Owner)
{
bmp=新图形::TBitmap;
bmp->HandleType=bmDIB;
bmp->PixelFormat=PF32位;
改变(这个);
}
//---------------------------------------------------------------------------
void u fastcall TForm1::sb_rgbChange(TObject*发送方)
{
如果(!xs)|(!ys))返回;//尚未初始化窗口?
int i,n,x,y,yy,sz=10;
德沃德**p,a;
颜色c0,c1,c2,c;
//直接像素访问
p=新DWORD*[ys];
对于(y=0;yScanLine[y];
bmp->Canvas->Font->Height=sz;
bmp->Canvas->Font->Color=clWhite;
bmp->Canvas->Brush->Style=bsClear;
//清屏
对于(y=0;y位置;
c0.db[\u b]=255-sb\u b->位置;
c0.db[_a]=0;
Caption=AnsiString().sprintf(“目标颜色:%08Xh”,c0.dd);
//添加剂
n=(c0.db[\u r]+1)*(c0.db[\u g]+1)*(c0.db[\u b]+1);//c1所有可用颜色
对于(x=0;x R,G,B
c1.db[_a]=0;
c1.db[\u r]=a%(c0.db[\u r]+1);a/=(c0.db[\u r]+1);
c1.db[\u g]=a%(c0.db[\u g]+1);a/=(c0.db[\u g]+1);
c1.db[\u b]=a%(c0.db[\u b]+1);a/=(c0.db[\u b]+1);
对于(i=0;iTextOutA(xs>>1,y+sz,“+”);
对于(i=0;(yTextOutA(xs>>1,y+sz,“=”);
对于(i=0;(y1,y+sz,“=”);
对于(i=0;(yDraw(0,0,bmp);
删除[]p;
}
//---------------------------------------------------------------------------
void\uu fastcall TForm1::FormResize(TObject*发送方)
{
xs=ClientWidth-pan_right->Width;
ys=ClientHeight;
bmp->SetSize(xs,ys);
改变(这个);
}
//---------------------------------------------------------------------------
代码基于我对您上一个问题的回答(链接在OP中)。因此,我从所有可用颜色中选择了
xs
(渲染调色板的宽度),而不是
random

正如您所见,algo工作正常

其思想是计算在
n
变量中有多少可用颜色,然后任何
i
-th颜色形式
只是每个通道使用值的模(因此
r0、g0、b0
256-r0,

你知道如果你想把3个整数变量
x,y,z
组合成一个

x = <0,xs)
y = <0,ys)
z = <0,zs)
返回:

x = w%xs
y = (w/xs)%ys
z = (w/(xs*ys))%zs
PS.如果您想更好地对颜色进行排序,您可以将选择的颜色转换为HSV,并按值、饱和度、色调进行排序()(在我看来,顺序最好……色调必须排在最后!!!)如下:

/$$----表格CPP----
//---------------------------------------------------------------------------
#包括
#包括
#布拉格语hdrstop
#包括“win_main.h”
//---------------------------------------------------------------------------
#pragma包(智能初始化)
#pragma资源“*.dfm”
TForm1*Form1;
int xs=0,ys=0;//分辨率
Graphics::TBitmap*bmp=NULL;//屏幕返回缓冲区
//---------------------------------------------------------------------------
const int _r=2;//通道顺序
常数int_g=1;
常数int_b=0;
常数int_a=3;
常数int_h=2;
常数int_s=1;
常数int_v=0;
联合色
{
字节db[4];//通道访问
DWORD dd;//所有32位颜色
};
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
无效rgb2bgr(彩色和彩色)
{
字节a;
A.
x = w%xs
y = (w/xs)%ys
z = (w/(xs*ys))%zs