我目前正在研究一个程序,以帮助摄影师创建timelapses。 它计算一系列图像的亮度下降或上升。所以曝光和iso的变化不会影响整体亮度的下降。在BufferedImage中乘以像素值导致奇怪的行为
为此,我使用一个简单的基于Swing的界面来显示第一张和最后一张图片。在它们下面是滑块来调整图像的亮度。
这是通过对DataBuffer底层的BufferedImages的直接操作来应用的。
大多数情况下,这种方法很有效,但我遇到了一些似乎有问题的图像。
你知道为什么会发生这种情况吗?
public BufferedImage getImage(float mult){
BufferedImage retim;
retim = new BufferedImage(img.getWidth(), img.getHeight(), img.getType());
Graphics g = retim.getGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();
DataBufferByte db = (DataBufferByte) retim.getRaster().getDataBuffer();
byte[] bts = db.getData();
for(int i=0;i<bts.length;i++){
float n = bts[i]*mult;
if(n > 255){
bts[i]= (byte) 255;
}else{
bts[i] = (byte) n;
}
}
return retim;
}
这是一种采用浮动并将图像中的每个像素与其相乘的方法。 (和一些防止字节值溢出的代码)。
This is the unwanted behaviour (on the left) and the expected on the right.
非常感谢!我已经尝试过实现java字节的伪无符号版本来克服这个问题,但是简单地使用rescale op可以更好地工作;) – I4k