Je travaille actuellement sur un programme pour aider les photographes à créer des timelapses. Il calcule une baisse ou une augmentation de la luminosité sur une série d'images. Ainsi, le changement d'exposition et d'iso par exemple n'affectent pas la baisse globale de la luminosité. Pour cela, j'utilise une interface simple basée sur Swing qui affiche la première et la dernière image. Sous eux sont des curseurs pour ajuster la luminosité de l'image.Multiplier les valeurs de pixels dans BufferedImage entraîne un comportement étrange
Ceci est appliqué via une manipulation directe du DataBuffer sous-jacent BufferedImages.
Généralement cela fonctionne mais j'ai rencontré quelques images qui semblent avoir un problème.
Avez-vous une idée pourquoi cela se produit?
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;
}
Ceci est la méthode qui prend un flottant et multiplie chaque pixel de l'image avec lui. (Et du code pour empêcher les valeurs d'octets de déborder).
This is the unwanted behaviour (on the left) and the expected on the right.
Merci beaucoup!J'ai déjà essayé d'implémenter une pseudo-version non signée de l'octet java pour surmonter cela, mais en utilisant simplement l'option «rescale», ça fonctionne beaucoup mieux;) – I4k