Augmenter la luminosité d'une image
Résolu/Fermé
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
-
11 mars 2012 à 17:30
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 13 mars 2012 à 15:45
KX Messages postés 16752 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 août 2024 - 13 mars 2012 à 15:45
A voir également:
- Augmenter la luminosité d'une image
- Augmenter la luminosité pc - Guide
- Image iso - Guide
- Augmenter vitesse pc windows 10 - Guide
- Comment agrandir une image - Guide
- Acronis true image - Télécharger - Sauvegarde
10 réponses
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
11 mars 2012 à 17:49
11 mars 2012 à 17:49
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);
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
Modifié par Étienne9 le 11/03/2012 à 18:42
Modifié par Étienne9 le 11/03/2012 à 18:42
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??
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
Modifié par KX le 11/03/2012 à 18:53
Modifié par KX le 11/03/2012 à 18:53
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.
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.
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
Modifié par KX le 11/03/2012 à 18:58
Modifié par KX le 11/03/2012 à 18:58
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());
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
12 mars 2012 à 14:04
12 mars 2012 à 14:04
C'est au brightness qu'on touche ?
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
12 mars 2012 à 14:30
12 mars 2012 à 14:30
Oui, je crois, il faudrait tester pour s'en assurer...
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 09:32
13 mars 2012 à 09:32
On peut charger une image en HSB directement ?
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 12:03
13 mars 2012 à 12:03
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 ?
Et votre code je dois tout mettre dans deux boucles imbriquées c'est ça ?
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
13 mars 2012 à 12:09
13 mars 2012 à 12:09
Oui c'est ça, mais normalement la teinte (hue : qui est entre 0 et 360) tu n'as pas à y toucher.
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
Modifié par Étienne9 le 13/03/2012 à 12:18
Modifié par Étienne9 le 13/03/2012 à 12:18
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.
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
13 mars 2012 à 12:20
13 mars 2012 à 12:20
Tu peux changer hsb[1] et hsb[2] en même temps (genre augmenter le premier et diminuer le deuxième) ça ne posera aucune problème !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 12:23
13 mars 2012 à 12:23
Mais hsb[0] je n'ai même pas besoin de lui attribuer quoi que ce soit non ?
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
13 mars 2012 à 12:31
13 mars 2012 à 12:31
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.
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 12:34
13 mars 2012 à 12:34
Avec la luminosité j'ai un problème, quand je tape une valeur inférieur à 100 l'image est noire.
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 12:45
13 mars 2012 à 12:45
Peut être que j'ai compris, si je mets entier aussi...
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
13 mars 2012 à 12:50
13 mars 2012 à 12:50
d'autant que j'ai rappelé tout à l'heure que la valeur était entre 0 et 1 !!!
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 12:52
13 mars 2012 à 12:52
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.
}
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.
}
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
13 mars 2012 à 13:38
13 mars 2012 à 13:38
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.
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;
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 14:43
13 mars 2012 à 14:43
Merci beaucoup, c'est résolu pour moi.
Une fois encore vous m'avez sauvé la vie.
Une fois encore vous m'avez sauvé la vie.
Étienne9
Messages postés
1022
Date d'inscription
mardi 1 mars 2011
Statut
Membre
Dernière intervention
10 mai 2015
49
13 mars 2012 à 15:40
13 mars 2012 à 15:40
Qu'est alpha s'il vous plaît ?
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
13 mars 2012 à 15:45
13 mars 2012 à 15:45
La transparence, c'est le A de ARGB
slayyem88
Messages postés
2
Date d'inscription
mardi 13 mars 2012
Statut
Membre
Dernière intervention
13 mars 2012
13 mars 2012 à 12:00
13 mars 2012 à 12:00
je cherche le méme probléme
KX
Messages postés
16752
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
31 août 2024
3 019
13 mars 2012 à 12:01
13 mars 2012 à 12:01
Et bien lis, la réponse sera la même !