使用 Java BufferedImage 的图像过滤器:如何更改所有像素颜色,直到它们收敛为全灰图像
Image filter with Java BufferedImage: how to change all pixels colors untill they converge to a total gray image
我有一个起始 BufferedImage(下图中的 (a))。我不知道如何调用这个过滤器,但我需要将所有图 (a) 像素从 (b) 逐渐转换为 (c),直到它们都变成灰色 (d)。我怎样才能做到这一点?谢谢!
看起来可以通过线性插值来实现。我不会深入讨论代码的细节,只是给你一个算法,让你走上正轨。
假设颜色表示为范围为 [0,1] 的 RGB 浮点值。所以 (0.0,0.0,0.0)
表示 0% 红色,0% 蓝色和 0% 绿色; (0.5,0.4,0.3)
表示 50% 红色、40% 蓝色和 30% 绿色。如果你的颜色在 [0,255] 范围内,它应该是一样的。我更喜欢 [0,1] 范围,因为它对某些着色器效果更好。您始终可以除以 255 使它们进入 [0,1] 范围,并在末尾乘以 255 使它们回到原始范围。
您有两张图片:您的基础图片(我们称之为 Source
)和完全不透明的 post 处理效果(在本例中为纯灰色,我们称之为 Target
).
要在它们之间进行线性插值,您只需将它们的 RGB 值添加一个随时间变化的因子加权,源从 0 到 1,目标从 1 到 0,因此两个 RGB 值的总和永远不会超出各自通道的颜色范围。
以你为例:
- 对于 a),您将使用
RGB(Source) * 1.0 + RGB(Target) * 0.0
- 对于 b),您将使用
RGB(Source) * 0.667 + RGB(Target) * 0.333
- 对于 c),您将使用
RGB(Source) * 0.333 + RGB(Target) * 0.667
- 对于 d),您将使用
RGB(Source) * 0.0 + RGB(Target) * 1.0
我有一个起始 BufferedImage(下图中的 (a))。我不知道如何调用这个过滤器,但我需要将所有图 (a) 像素从 (b) 逐渐转换为 (c),直到它们都变成灰色 (d)。我怎样才能做到这一点?谢谢!
看起来可以通过线性插值来实现。我不会深入讨论代码的细节,只是给你一个算法,让你走上正轨。
假设颜色表示为范围为 [0,1] 的 RGB 浮点值。所以 (0.0,0.0,0.0)
表示 0% 红色,0% 蓝色和 0% 绿色; (0.5,0.4,0.3)
表示 50% 红色、40% 蓝色和 30% 绿色。如果你的颜色在 [0,255] 范围内,它应该是一样的。我更喜欢 [0,1] 范围,因为它对某些着色器效果更好。您始终可以除以 255 使它们进入 [0,1] 范围,并在末尾乘以 255 使它们回到原始范围。
您有两张图片:您的基础图片(我们称之为 Source
)和完全不透明的 post 处理效果(在本例中为纯灰色,我们称之为 Target
).
要在它们之间进行线性插值,您只需将它们的 RGB 值添加一个随时间变化的因子加权,源从 0 到 1,目标从 1 到 0,因此两个 RGB 值的总和永远不会超出各自通道的颜色范围。
以你为例:
- 对于 a),您将使用
RGB(Source) * 1.0 + RGB(Target) * 0.0
- 对于 b),您将使用
RGB(Source) * 0.667 + RGB(Target) * 0.333
- 对于 c),您将使用
RGB(Source) * 0.333 + RGB(Target) * 0.667
- 对于 d),您将使用
RGB(Source) * 0.0 + RGB(Target) * 1.0