我已经完成了亮度增加,但在尝试了很多后无法减少。例如:我的像素的rgb值是r = 100,g = 200; b = 125。我正在使用numericupdown来增加和减少该值。当我添加,例如,100使用numupdown。新值将是r = 200,g = 300和b = 255。但我们采取g = 300 - > g = 255,因为我们不能超过255.当我将值减小到100时,值应为r = 100,g = 200,b = 125返回。由于改变g的值,因此g将不再是g = 200,因为g等于255且255-100 = 155,它不等于200 ..请求帮助将像素值再次设置为相同而降低。
P.s:我是学习者
答案 0 :(得分:3)
存储原始图像并显示副本。每次运行算法时,都会读取原始像素值,并将修改后的像素值写入副本。
答案 1 :(得分:0)
注意:这是一种非常简单的方法。亮度是一个讨论很好的主题,有很多选择。对于复杂的解决方案,您通常还会拖累饱和度等等。每个像素选项可能不是最好的方法,但为了这篇文章我已经构建了一个答案,将解决您下面的具体问题。
//编辑2 考虑到这一点,我没有想到方程式的解决方案不是唯一的。您确实需要存储原始图像并从原始图像重新计算。我仍然会建议使用经过批准的亮度等式,如上面的链接中所示。简单地修改R,G和B频道可能不是您的用户所期望的。
以下答案必须与处理原始图像并显示其他答案中提到的修改后的副本相结合。
我不会直接增加R,G和B频道,但会使用here中的感知亮度选项。
让我们说:
L = (0.299*R + 0.587*G + 0.114*B)
你知道min(L)将为0,而max(L)将为255.这是你的数字上/下将被限制为[0,255]的地方。接下来,您只需增加/减少L并使用公式计算RGB。
//编辑 你的例子如下:
r=100 , g = 200 ; b =125
L = (0.299*100 + 0.587*200 + 0.114*125)
L = 161.5
现在让我们转到最大(有限)以获得极端情况并看到它仍然有效:
L = 255
L = (0.299*255 + 0.587 * 255 + 0.114 * 255)
RGB = (255,255,255)
返回也将始终有效,0给出黑色之间的所有内容在[0,255]中的R,G,B范围内保证RGB。
答案 2 :(得分:0)
另一种可能更优雅的解决方案是将RGB值映射到HSV颜色空间。
进入HSV色彩空间后,您可以增大和减小值(V)以控制亮度,而不会丢失色调或饱和度信息。
This question给出了一些关于如何从RGB转换为HSV的指示。