IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++Builder Discussion :

Contraste et luminosité d'une image


Sujet :

C++Builder

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2005
    Messages : 60
    Points : 50
    Points
    50
    Par défaut Contraste et luminosité d'une image
    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.

  2. #2
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    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
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    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é :

    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;
    };
    En global :

    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
    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
    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 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
    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);
    }
    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
     
    void __fastcall TForm1::LuminositeChange(TObject *Sender)
    {
    AppliquerLuminosite(Luminosite->Position);
    }
    Peut-être qu'il y a mieux comme algo ... ???
    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 !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Augmenter la luminosité d'une image
    Par Étienne9 dans le forum Traitement d'images
    Réponses: 5
    Dernier message: 14/03/2012, 08h47
  2. Atténuer une le contraste et la luminosité d'une image
    Par agenceaupair dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 30/11/2010, 18h06
  3. Augmenter la luminosité d'une image
    Par Bleys dans le forum OpenCV
    Réponses: 10
    Dernier message: 25/06/2010, 11h59
  4. Luminosité d'une image sous matlab
    Par autoin dans le forum Images
    Réponses: 4
    Dernier message: 12/04/2010, 01h01
  5. modifier le contraste et la luminosité d'une image
    Par djtsou dans le forum Interfaces Graphiques
    Réponses: 6
    Dernier message: 31/03/2008, 18h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo