我正在使用RescaleOp
来照亮我的图像,我的问题是,如果我使用黑色(0,0,0)和白色(255,255,255),它们会返回完全相同。
我可以猜到为什么,0(黑色 RGB 值)x 1.3(亮度因子)= 0,并且白色像素不能高于 255,因此它们保持不变,我对白色像素保持不变感到满意。
另一方面,如果我使图像变暗,我会得到想要的结果,因为白色像素变暗,255(白色 RGB 值)* .8(亮度因子)=/= 255,并且黑色像素不能低于 0,因此它们保持不变。
如何使黑色像素变亮,就像使用缓冲图像操作使白色像素变暗一样?
这是重新缩放操作
float scale = 1.3f;//This is the aformentioned "Brightness Factor"
RescaleOp op = new RescaleOp(new float[] {scale,scale,scale, 1}, new float[4], null);
BufferedImage brightImage = op.filter(...);
感谢您当前的答案,但我不明白如何将它们应用于我的问题。
您将不得不从最大值开始。亮度因数代表什么并不明显,所以你可能不得不在这里做一些反复试验的研究。一种方法可能是:
int newValue = (int) (255 - (255 / 1.3));
任何乘以 0 的东西都是 0。使用消极的方法。
最大值-(最大值/亮度因子)。
255-255/1.3 在您的情况下。
将其存储在整数中。
选项:
- 编写一个自定义 RasterOp,用于扩展 RescaleOp 以提供所需的行为(特别是,如果值 = 0 &&比例因子> 1,则新值 = 1 * 比例因子 = 比例因子)
- 串行使用两个栅格操作。 第一个的比例因子为 1,偏移量为 1(使所有内容稍微亮一些)。 第二个是您已定义的现有栅格操作。 它比第一个更混乱,可能更慢,但可能更容易实现。