我写了一个方法,将3种颜色的渐变应用于图像。 颜色是蓝色 - >黄色 - >红色。 我正在从黄色到红色的颜色平滑过渡,但如果亮度低于0.5,则从蓝色过渡 - >黄色是从蓝色到绿色到黄色的凸起,所以它根本不光滑。 我希望在图像上有一个像热效应一样的效果。
我不知道我做错了什么,我写了下面的方法。 我计算要应用于颜色模板的原始像素的亮度。
public void applyGradient()
{
size = width * height;
float r, g, b;
float redTemp, yellowTemp, blueTemp;
float luminance = 0;
float result;
index = 0;
redTemp = 0xff000000 | (255 << 16) | (0 << 8) | 0;
yellowTemp = 0xff000000 | (255 << 16) | (255 << 8) | 0;
blueTemp = 0xff000000 | (0 << 16) | (0 << 8) | 255;
while(index < size)
{
r = (rgbInput[index]& 0x00FF0000) >> 16;
g = (rgbInput[index]& 0x0000FF00) >> 8;
b = (rgbInput[index]& 0x000000FF);
luminance = ((r+b+g)/3)/255;
if (luminance < 0.5)
{
result = (float) ((yellowTemp * luminance * 2.0) + blueTemp * (0.5 - luminance) * 2.0);
}
else
{
result = (float) (redTemp * (luminance - 0.5) * 2.0 + yellowTemp * (1.0 - luminance) * 2.0);
}
output[index] = (int)result;
index++;
}
}
答案 0 :(得分:0)
根据亮度的分布,我认为你的问题在这里:
if (luminance < 0.5)
{
result = (int) ((yellowTemp * luminance * 2.0) + blueTemp * (0.5 - luminance) * 2.0);
}
else
{
result = (int) (redTemp * (luminance - 0.5) * 2.0 + yellowTemp * (1.0 - luminance) * 2.0);
}
如果亮度小于0.5且亮度非常小,那么您将变为蓝色。 例如,如果亮度为0.0000001,则黄色为(0.0000001 * 2.0)= 0.0000002,蓝色为((0.5-0.0000001)* 2.0)= 0.9999998,比黄色高6个数量级。
如果亮度为0.6,则红色为((0.6 - 0.5)* 2.0)= 0.2,黄色为((1.0 - 0.6)* 2.0)= 0.8,如果您的亮度分布为0,则会给出一些黄色如果亮度为0.9,则红色将为0.8,黄色为0.2。 (如果亮度= 0.9999,则红色为0.9998,黄色为0.0002)。
如果你检查亮度的分布并且总是在尾部,即总是非常小或非常大,那么你将不会得到任何黄色。
另一方面,如果您的亮度分布是高斯分布或对数正态分布,那么我建议您在yellowTemp或redTemp计算中出错。