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

Dotnet Discussion :

Modifications Image et histogramme


Sujet :

Dotnet

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 22
    Par défaut Modifications Image et histogramme
    Bonjour à tous,

    je cherche à créer une classe en C# permettant de réaliser diverses tâches sur une image donnée comme par exemple :

    - inverser les couleurs de l’image (comme un négatif en photo).
    - Additionner deux images pixel par pixel.
    - Transformer une image couleur en image noir et blanc.
    - Créer un histogramme de la couleur noir composant une image.
    - Déterminer à quel point l’image est blanche en fonction de l’histogramme précédent.

    Après quelques recherches, j'ai cru comprendre qu'il fallait utiliser le unsafe plutot que les Graphics qui sont beaucoup trop lents. est-ce correct et comment cela marche ?

    De plus, pour les histogrammes. Je pense avoir compris comment ça marchait en théorie, maintenant pour une image couleur, comment obtenir son histogramme de couleur noire uniquement ?

    Ensuite pour la "résolution" de l'image ( 256 couleurs, 16 bits, 32bits...) comment peut-on le récupérer ?

    Pour l'inversion des couleurs j'ai cru comprendre qu'il fallait utiliser l'histogramme et inverser la courbe. Mais l'exemple était en noir et blanc.
    Pour une image en couleur, il faut inverser l'histogramme des couleurs rouge, vert et bleu ??

    Je suis un peu perdu et débutant en C# donc c'est pourquoi je viens vers vous.

    Je cherche à créer cette classe pour mon projet de BTS.

    En vous remerciant.

    P.S: Pour vos réponses, pensez bien que vous parlez à un débutant qui n'y connais pas grand chose, donc je compte sur vous pour partir de 0 dans les explications ^ ^

  2. #2
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Avril 2005
    Messages : 36
    Par défaut
    Je ne connais pas le unsafe, donc je ne pourrais pas t'aider beaucoup sur ce point.

    J'avais vu en cours la méthode pour faire un négatif.
    Après un rapide test, il me prend environ 3 secondes pour une image en 800x600, ce qui me semble raisonnable.

    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
    47
    48
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    Image img = Image.FromStream(openFileDialog1.OpenFile());
                    pictureBox1.Image= img;
                }
            }
     
            private void button2_Click(object sender, EventArgs e)
            {
                DateTime dt = DateTime.Now;
     
     
                Bitmap bmp = (Bitmap)pictureBox1.Image;
     
                int w = bmp.Width;
                int h = bmp.Height;
     
                Color col, res;
                for (int y = 0; y < h; y++)
                {
                    for (int x = 0; x < w; x++)
                    {
                        col = bmp.GetPixel(x, y);
                        res = Color.FromArgb(255 - col.R, 255 - col.G, 255 - col.B);
                        bmp.SetPixel(x, y, res);
                    }
                    //Redessine l'image dans la picturebox
                    pictureBox1.Invalidate();
                }
     
                TimeSpan tempsecoule = DateTime.Now.Subtract(dt);
                MessageBox.Show(string.Format("{0}:{1}:{2}",tempsecoule.Hours,tempsecoule.Minutes,tempsecoule.Seconds));
     
            }
        }
    }
    Projet joins, VS2008 SP1 et Framework 3.5 SP1

    EDIT :

    Voici une autre méthode prenant moins de temps:
    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
                Bitmap bmp = (Bitmap)pictureBox1.Image;
                Bitmap newBmp = new Bitmap(bmp.Width, bmp.Height);
     
                Graphics g = Graphics.FromImage(newBmp);
     
                ColorMatrix cm = new ColorMatrix(new float[][]
                    {
                    new float[] {-1, 0, 0, 0, 0},
                    new float[] {0, -1, 0, 0, 0},
                    new float[] {0, 0, -1, 0, 0},
                    new float[] {0, 0, 0, 1, 0},
                    new float[] {1, 1, 1, 1, 1}
                    });
                ImageAttributes attributes = new ImageAttributes();
     
                attributes.SetColorMatrix(cm);
     
                g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, attributes);
                g.Dispose();
     
                pictureBox1.Image = (Image)newBmp;
    Fichiers attachés Fichiers attachés

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/03/2009, 20h59
  2. modification image background
    Par rif15 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 20/04/2008, 23h22
  3. segmentation d image par histogramme et luminance
    Par svagrim dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 21/11/2007, 14h21
  4. Sur survole modification image précédente
    Par 12_darte_12 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 01/12/2006, 16h02

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