Augmenter la luminosité d'une image
Résolu
Étienne9
Messages postés
1090
Statut
Membre
-
KX Messages postés 19031 Statut Modérateur -
KX Messages postés 19031 Statut Modérateur -
Bonjour,
Alors voilà, désormais je cherche à augmenter la luminosité d'une image en pour-cent.
Ma première idée est de travailler en ARGB et augmenter la luminance mais je ne sais pas si c'est comme ça que l'on doit faire.
Cordialement.
Alors voilà, désormais je cherche à augmenter la luminosité d'une image en pour-cent.
Ma première idée est de travailler en ARGB et augmenter la luminance mais je ne sais pas si c'est comme ça que l'on doit faire.
Cordialement.
10 réponses
-
Au lieu de travailler en RGB, tu devrais utiliser le format HSB (hue, saturation, brightness)
int rgb = img.getRGB(x, y); Color clr = new Color(rgb); float[] hsb = Color.RGBtoHSB(clr.getRed(), clr.getGreen(), clr.getBlue(), null); //TODO : modification de hsb pour traitement int rgb2 = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]); img.setRGB(x, y, rgb2);
-
Question : après je devrai sûrement programmer quelque chose pour augmenter ou diminuer la saturation, je travaillerai aussi en HSB et je changerai juste le S ou c'est plus compliqué que ça??
-
Normalement modifier la saturation devrait suffire. Après peut-être que ça ne fera pas exactement ce que tu veux et qu'il faudra aussi jouer sur le contraste, mais dans tout les cas tu ne touchera pas à la teinte.
La seule vraie complication que tu pourrais avoir c'est avec la transparence, car je ne sais pas trop comment ça se comporte lors du passage de RGB à HSB, puisque l'alpha n'est pas passé en paramètre de la conversion... Mais au pire il suffira de le récupérer avant, de faire la conversion, puis de le remettre après. -
En tenant compte de la transparence :
int rgb = img.getRGB(x, y); Color clr = new Color(rgb,true); int alpha = clr.getAlpha(); float[] hsb = Color.RGBtoHSB(clr.getRed(), clr.getGreen(), clr.getBlue(), null); //TODO : modification de hsb pour traitement rgb = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]); clr = new Color(rgb); clr = new Color(clr.getRed(), clr.getGreen(), clr.getBlue(), alpha); img.setRGB(x, y, clr.getRGB());
-
-
-
-
-
hsb[0] c'est hue, hsb[1] c'est saturation et hsb[2] c'est Brightness c'est ça ?
Et votre code je dois tout mettre dans deux boucles imbriquées c'est ça ? -
Une question : j'essaie de faire la fonction mais qui s'appelle lumisat, c'est-à-dire qu'avec une seule fonction elle va faire deux choses. Possible ? Style, selon le paramètre elle change soit la luminosité, soit la saturation.
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Mais hsb[0] je n'ai même pas besoin de lui attribuer quoi que ce soit non ?
-
Regarde mon code ! hsb est issu de la conversion RGBtoHSB à partir du pixel existant, donc hsb[0] a déjà une valeur qui correspond à un angle entre 0 et 360 degrés du cercle chromatique et correspondant aux valeurs RGB déjà présente initialement dans l'image. Si tu modifies hsb[0] tu vas changer la couleur alors que toi tu veux juste agir sur les deux autres.
-
-
Avec la luminosité j'ai un problème, quand je tape une valeur inférieur à 100 l'image est noire.
-
Voilà ma fonction, il y a un soucis pour la luminosité inférieure à 100%
Alors désolé pour les commentaires que vous m'avez fait souvent avec les paramètres mais je ne suis pas habitué à mettre énormément de paramètres.
public static void lumisat(String choix, int pourcent)
{
// Cette fonction est chargée de changer soit la luminosité soit la saturation.
int pix=0,h=0,w=0,x=0,y=0;
double lumi=0,sat=0;
if ((pourcent == 100) || (pourcent <=0)) {
// Si la valeur est 100%, cela ne sert à rien d'appliquer la fonction.
System.out.println("Erreur : le pourcentage est soit négatif soit egal a 0.");
return;
}
else {
lumi = 1;
sat = 1;
if(choix.equals("luminosite")) {
lumi = pourcent/100;
}
else {
if(choix.equals("saturation")) {
sat = pourcent/100;
}
}
}
BufferedImage img=null;
try {
img = ImageIO.read(new File("./image.bmp"));
}
catch (Exception e) {}
w = img.getWidth();
h = img.getHeight();
for(y=0;y<h;y++) {
for(x=0;x<w;x++) {
int rgb = img.getRGB(x, y);
Color clr = new Color(rgb,true);
int alpha = clr.getAlpha();
float[] hsb = Color.RGBtoHSB(clr.getRed(), clr.getGreen(), clr.getBlue(), null);
hsb[1] = (float) (hsb[1]*sat);
hsb[2] = (float) (hsb[2]*lumi);
rgb = Color.HSBtoRGB(hsb[0],hsb[1],hsb[2]);
clr = new Color(rgb);
clr = new Color(clr.getRed(), clr.getGreen(), clr.getBlue(), alpha);
img.setRGB(x, y, clr.getRGB());
}
}
try {
ImageIO.write(img,"bmp",new File("lumisat.bmp"));
}
catch (Exception e) {};
// Et on crée l'image.
}-
Si tu fais pourcent/100 alors que pourcent est un entier inférieur à 100 alors nécessairement ça fera 0 !
HSB t'impose d'utiliser des float, alors pourquoi mettre des double en plein milieu ?
De plus ton code ne te permet que d'augmenter les valeurs pas de les diminuer.
Il faudrait plutôt utiliser au maximum les float en passant en paramètre 1 (=100% pas de changement), entre 0 et 1 (diminution), supérieur à 1 (augmentation), ça t'évitera la manipulation toute moche de String.
public static void lumisat(float lumi, float sat) // ... hsb[1] *= lumi; hsb[2] *= sat;
-
-
Merci beaucoup, c'est résolu pour moi.
Une fois encore vous m'avez sauvé la vie. -
-