java - 如何通过代码在位图上应用蓝色到黄色渐变,亮度作为因素

标签 java c++ image-processing colors gradient

我需要对位图应用蓝色到黄色的渐变。 这里的因素是亮度。 照片的暗区需要偏蓝,最亮的区域需要偏黄。 所以每个像素的亮度都需要作为一个因素。

有人可以帮助我如何用 C++ 或 Java 完成这个吗? 输入是原始照片的 rgb 整数值数组。

最佳答案

听起来有点像家庭作业题,但这是一般的想法,或者至少,我会怎么做。

对于每个像素,计算平均亮度,所以将 R GB 加在一起然后除以 3 得到结果(你此处需要使用大于 8 位的变量!)。

现在您有一个 0-255 范围内的值,表示像素的亮度(有多种方法可以计算亮度,但现在可以这样做)。

全蓝色是 (0,0,255),全黄色是 (255,255,0) — 所以您需要在这些值之间进行插值(我们将使用线性插值此处):

例如,如果您的亮度为 50,它大约是 255 的 20%,因此您需要一种 80% 蓝色和 20% 黄色的颜色。您可以像这样计算红色 channel 的值:

R = (brightness / max) * (R in Yellow - R in Blue);

对其他 channel 进行类似的计算,因此对于亮度为 50 的像素,我们会这样做:

R = (50 / 255) * 255;
G = (50 / 255) * 255;

当然,我们不能有负值,并且使用 B in Yellow - B in Blue 想法不会为蓝色 channel 削减它,您需要反转插值。通过取 0.2 并从 1 中减去它,我们可以在另一个方向上处理 0-255 的范围:

B = (1 - (50 / 255)) * 255;

额外说明:要在 C++ 中使用类似的东西,我建议使用 SDL,这种东西既好又简单。

关于java - 如何通过代码在位图上应用蓝色到黄色渐变,亮度作为因素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8832143/

相关文章:

python - 使用python以循环方式裁剪图像

c++ - 在两台计算机上使用 float 的相同代码会给出两个不同的结果

java - 使用 sendTextMessage() 将数据传递到广播接收器

java - 如何使用 Selenium WebDriver 处理 'Log in with Google' 弹出窗口

java - 如何将本地 dateTime 对象转换为 UTC java.util.Date

c++ - 缺少 openGL 纹理标志 GL_TEXTURE_RECTANGLE

c++ - 与平台无关的方式来监视文件系统事件

c++ - 处理 C++ 目标中的 ANTLR3 错误

image-processing - 从图像中消除各种背景并分割对象?

java - 每当我调用Activity时,应用程序崩溃并给出错误