В настоящее время я работаю над программой, помогающей фотографам создавать тайлапсы. Он вычисляет снижение или повышение яркости по серии изображений. Таким образом, изменение экспозиции и iso, например, не влияет на общее снижение яркости.Умножение значений пикселей в BufferedImage приводит к странному поведению
Для этого я использую простой интерфейс на основе Swing, который отображает первое и последнее изображение. Под ними есть ползунки для регулировки яркости изображения.
Это применяется при непосредственном воздействии BufferedImages, лежащего в основе DataBuffer.
В основном это работает, но я столкнулся с некоторыми изображениями, которые, похоже, имеют какую-то проблему.
У вас есть идея, почему это происходит?
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 работает намного лучше;) – I4k