Bonjour,
Pourriez-vous me dire comment je peux modifier le contraste et la luminosité d'une image (bmp ou jpg) en borland c++ builder 6.
D'avance merçi.
Bonjour,
Pourriez-vous me dire comment je peux modifier le contraste et la luminosité d'une image (bmp ou jpg) en borland c++ builder 6.
D'avance merçi.
Salut, va voir cette page, il y a beaucoup de code (Delphi et C++) pour plein d'effet sur des images: http://www.efg2.com/Lab/Library/Delp...Processing.htm
Salut !
Pour le traitement il faudra utiliser TBitmap::ScanLine et non pas TBitmap::TCanvas::Pixels qui fait perdre énormément de temps !
Le mieux est probablement de ne pas tenir compte des différents formats de bitmaps.
Dans ce cas, fixer le PixelFormat des bitmaps sur pf24bit.
Comme on a droit à une érosion graduelle qui n'est pas récupérable (revenir en arrière n'est alors pas possible), il faut disposer de deux bitmaps :
- l'un qui ne devra jamais être modifié (l'image source)
- l'autre qui ne servira qu'à contenir le résultat du traitement et à afficher ce résultat sur le support le plus simple.
Voici un exemple pour modifier la luminosité :
En global :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class jRgb { public : Byte Blue; Byte Green; Byte Red; };
Voici la méthode pour charger l'image depuis un menu et en se servant d'une TOpenDialog :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 Graphics::TBitmap *Srce = new Graphics::TBitmap; Graphics::TBitmap *Dest = new Graphics::TBitmap; //NE PAS OUBLIER DE DETRUIRE LES BITMAPS DANS LA ONCLOSE DE LA FORM
La méthode supplémentaire qu'il suffira de déclarer dans la classe de la form :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 void __fastcall TForm1::Open1Click(TObject *Sender) { if(OpenDialog1->Execute()) { Srce->LoadFromFile(OpenDialog1->FileName); if(Srce->PixelFormat != pf24bit) Srce->PixelFormat = pf24bit; Dest->PixelFormat = pf24bit; Dest->Width = Srce->Width; Dest->Height = Srce->Height; //Luminosite est un TScrollBar (Min = -255, Max = +255) Luminosite->Position = 0; //Méthode supplémentaire //L'appel ici ne sert qu'à remplir le bitmap Dest sans altérer la luminosité AppliquerLuminosite(0); } }
La modification de la luminosité se fait à l'aide d'un scrollbar :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 void __fastcall TForm1::AppliquerLuminosite(int L) { int v; jRgb *S; jRgb *D; //Plus rapide de scinder en deux : on augmente ou on diminue if(L >= 0) { // On augmente for(int y = 0; y < Srce->Height; y++) { S = (jRgb*)Srce->ScanLine[y]; D = (jRgb*)Dest->ScanLine[y]; for(int x = 0; x < Srce->Width; x++) { //Erosion dans le blanc, mais il n'y a pas plus blanc que blanc v = S->Blue + L; if(v > 255) v = 255; D->Blue = (Byte)v; v = S->Green + L; if(v > 255) v = 255; D->Green = (Byte)v; v = S->Red + L; if(v > 255) v = 255; D->Red = (Byte)v; S++; D++; } } } else { // On diminue for(int y = 0; y < Srce->Height; y++) { S = (jRgb*)Srce->ScanLine[y]; D = (jRgb*)Dest->ScanLine[y]; for(int x = 0; x < Srce->Width; x++) { //Erosion dans le noir, mais il n'y a pas plus noir que noir v = S->Blue + L; if(v < 0) v = 0; D->Blue = (Byte)v; v = S->Green + L; if(v < 0) v = 0; D->Green = (Byte)v; v = S->Red + L; if(v < 0) v = 0; D->Red = (Byte)v; S++; D++; } } } //On dessine au plus simple, directement sur la form Canvas->Draw(0,0, Dest); }
Peut-être qu'il y a mieux comme algo ... ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void __fastcall TForm1::LuminositeChange(TObject *Sender) { AppliquerLuminosite(Luminosite->Position); }
Ici je me suis contenté de tirer linéairement les composantes soit vers le noir soit vers le blanc !
Pour le contraste... à toi de jouer !
A plus !
Partager