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

Windows Forms Discussion :

Image Processing - Step 1


Sujet :

Windows Forms

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Points : 66
    Points
    66
    Par défaut Image Processing - Step 1
    Bonjour,

    Je suis en train de m’énerver tout seul devant mon PC donc j'ai décidé de faire appel à vous pour la santé de mes nerfs.
    J'ai peu/pas de réflexes en C# je suis plutôt développeur C/C++ dans le secteur embarqué mais j'ai voulu m'essayer à Windows/.NET/C# pour pas mourir idiot ...........

    Bref dans ce code j'essaye de préparer mon environnement de travail pour du traitement d'image ultérieurement. Je cherche à disposer de 3 choses :
    - une visu de l'image d'origine : C'est OK j'ai une PictureBox avec mon image.
    - un buffer de travail (traitement) : avec juste les pixels et là j'ai besoin de vous
    - une visu de l'image après traitement : Je pense baser cette visu sur une seconde PictureBox. J'ai là aussi besoin de vous pour comprendre comment ré-injecter mon buffer de pixel dans ce contrôle.

    Voici mon code (qui ne me donne pas satisfaction). Dans le buffer de sortie je n'ai rien (une surface de la même couleur que le fond de la fenêtre) !

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
            // Mon objectif ici est d'avoir une Form avec 2 PicturesBox. La premiere affiche l'image de départ (sans traitement).
            // La seconde doit me permettre de visualiser les effets de mon traitement. Entre les deux je souhaite disposer des pixels 
            // dans un tableau en mémoire pour effectuer des operations "matricielle" dessus. 
     
            // ImgSrc est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
            // ImgTgt est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
     
            private void button2_Click(object sender, EventArgs e)
            {
                int i;
     
     
                /* Calcul, creation et initialisation des variables propres à l'image source */
                PixelCountSrc = ImgSrc.Width * ImgSrc.Height;
                BmpSrc = new Bitmap(ImgSrc.Image);
         // A cet endroit je peut lire que le pixelFormat de BmpSrc est Format32bppArgb. 
         // Q1 - Savez-vous pourquoi c'est pas le meme que celui de l'image passé en parametre au constructeur ?
     
                DepthSrc = ImgSrc.Image.PixelFormat;
                FullImage = new Rectangle(0, 0, BmpSrc.Width, BmpSrc.Height);
               //  bitmapDataSrc = BmpSrc.LockBits(FullImage, ImageLockMode.ReadWrite, BmpSrc.PixelFormat);
                bitmapDataSrc = BmpSrc.LockBits(FullImage, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
         // Ici le LockBits se fait sur une instance qui comporte deja une propriété PixelFormat donc le respecifier ici n'a de sens que pour "Forcer" un format de sortie.
         // Q2 - Ai-je bon ? si non, pourriez-vous m'eclairer ?
     
     
                /* Calcul, creation et initialisation des variables propres à l'image de sortie */
                BmpTgt = new Bitmap(ImgDst.Image);
         // A cet endroit je peut lire que le pixelFormat de BmpTgt est Format32bppArgb. 
         // Mais je prendrai la réponse à Q1 ici aussi.
                bitmapDataTgt = BmpTgt.LockBits(FullImage, ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
         // blablabla, je prendrai ici aussi la réponse à Q2
     
                /* Calcul, creation et initialisation des variables propres au buffer de travail */
                BmpPixels = new byte[PixelCountSrc * 3];
         // Bon ici j'ai mis 3 car j'ai demandé Format24bppRgb au dessus. Mais j'adapterai en fonction des réponses précedentes
                Marshal.Copy(bitmapDataSrc.Scan0, BmpPixels, 0, BmpPixels.Length);
     
                /* Traitement bidon */
                for (i = 0; i < BmpPixels.Length; i += 3)
                {
                    BmpPixels[i] = (byte)(0xFF);    // Red
                    BmpPixels[i + 1] = (byte)0xFF;  // Green
                    BmpPixels[i + 2] = (byte)0xFF;  // Blue
                }
     
                // Vu que la PictureBox est en 24Bpp et le bitmap en 32Bpp je suppose que la ligne suivante est incorrecte
                Marshal.Copy(BmpPixels, 0, bitmapDataTgt.Scan0, BmpPixels.Length);
     
                // Je n'es suis pas encore là (bien malheureusement ....)
                if (ImgDst.Image != null) 
                    ImgDst.Dispose();
                ImgDst.Image = BmpTgt;
                ImgDst.Refresh();
            }
        }
    Merci à tous ceux qui pourront m'aider et aussi a ceux qui essayeront.

    Cordialement,
    Sylvain

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Salut, ne te casse pas la tête il existe des librairies de manipulation et de traitement d'image déjà toute faites.
    Tu peux trouver des codes fonctionnels qui transforment le format de pixel de ton image par exemple :
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
     
    private static ColorPalette _Palette = null;
    		private static ColorPalette m_Palette
    		{
    			get
    			{
    				if (_Palette == null)
    				{
    					_Palette = new Bitmap(1, 1, PixelFormat.Format8bppIndexed).Palette;
    					for (int i = 0; i < 256; i++)
    					{
    						_Palette.Entries[i] = Color.FromArgb(i, i, i);
    					}
    				}
    				return _Palette;
    			}
    		}
     
     
    		public static Bitmap Convert(Bitmap pImage, PixelFormat pFormat)
    		{
    			switch (pFormat)
    			{
    				case PixelFormat.Format8bppIndexed:
    					{
     
    						int w = pImage.Width, h = pImage.Height, r, ic, oc, bmpStride, outputStride, bytesPerPixel;
    						PixelFormat pfIn = pImage.PixelFormat;
    						Bitmap output;
    						BitmapData bmpData, outputData;
     
    						//Create the new bitmap
    						output = new Bitmap(w, h, PixelFormat.Format8bppIndexed);
     
    						output.Palette = m_Palette;
     
    						//No need to convert formats if already in 8 bit
    						if (pfIn == PixelFormat.Format8bppIndexed)
    						{
    							output = (Bitmap)pImage.Clone();
     
    							//Make sure the palette is a grayscale palette and not some other
    							//8-bit indexed palette
    							output.Palette = m_Palette;
     
    							return output;
    						}
     
    						//Get the number of bytes per pixel
    						switch (pfIn)
    						{
    							case PixelFormat.Format24bppRgb: bytesPerPixel = 3; break;
    							case PixelFormat.Format32bppArgb: bytesPerPixel = 4; break;
    							case PixelFormat.Format32bppRgb: bytesPerPixel = 4; break;
    							default: throw new InvalidOperationException("Image format not supported");
    						}
     
    						//Lock the images
    						bmpData = pImage.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.ReadOnly, pfIn);
    						outputData = output.LockBits(new Rectangle(0, 0, w, h), ImageLockMode.WriteOnly, PixelFormat.Format8bppIndexed);
    						bmpStride = bmpData.Stride;
    						outputStride = outputData.Stride;
     
    						//Traverse each pixel of the image
    						unsafe
    						{
    							byte* bmpPtr = (byte*)bmpData.Scan0.ToPointer(),
    							outputPtr = (byte*)outputData.Scan0.ToPointer();
     
    							if (bytesPerPixel == 3)
    							{
    								//Convert the pixel to it's luminance using the formula:
    								// L = .299*R + .587*G + .114*B
    								//Note that ic is the input column and oc is the output column
    								for (r = 0; r < h; r++)
    									for (ic = oc = 0; oc < w; ic += 3, ++oc)
    										outputPtr[r * outputStride + oc] = (byte)(int)
    										(0.299f * bmpPtr[r * bmpStride + ic] +
    										0.587f * bmpPtr[r * bmpStride + ic + 1] +
    										0.114f * bmpPtr[r * bmpStride + ic + 2]);
    							}
    							else //bytesPerPixel == 4
    							{
    								//Convert the pixel to it's luminance using the formula:
    								// L = alpha * (.299*R + .587*G + .114*B)
    								//Note that ic is the input column and oc is the output column
    								for (r = 0; r < h; r++)
    									for (ic = oc = 0; oc < w; ic += 4, ++oc)
    										outputPtr[r * outputStride + oc] = (byte)(int)
    										((bmpPtr[r * bmpStride + ic] / 255.0f) *
    										(0.299f * bmpPtr[r * bmpStride + ic + 1] +
    										0.587f * bmpPtr[r * bmpStride + ic + 2] +
    										0.114f * bmpPtr[r * bmpStride + ic + 3]));
    							}
    						}
     
    						//Unlock the images
    						pImage.UnlockBits(bmpData);
    						output.UnlockBits(outputData);
     
    						return output;
    					}
    				default:
    					{
    						var output = new Bitmap(pImage.Width, pImage.Height, pFormat);
    						using (Graphics g = Graphics.FromImage(output))
    						{
    							g.DrawImage(pImage, new Point(0, 0));
    						}
    						return output;
    					}
    			}
    		}
    (Pour l'utiliser tu devra cocher la case unsafe) dans les propriétés de ton projet.

    Ou bien utiliser http://www.emgu.com qui est vraiment bien faite pour tout ce qui est traitement et manipulation avec beaucoup d'exemples et notamment la fonction Convert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Image<Gray, byte> gray = new Image<Gray, byte>((Bitmap)ImgSrc.Image);
    			Image<Bgr, byte> color = gray.Convert<Bgr, byte>();
    			ImgDst.Image = color.ToBitmap();
    J'ai juste un commentaire car je n'ai quasiment pas lu ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var PixelCountSrc = ImgSrc.Width * ImgSrc.Height; // !!!! ImgSrc.Width != ImgSrc.Image.Width !!! attention tu peux avoir une picturebox qui fait 3x3 pixels sur ton écran mais qui affiche une image de 500x500

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Merci d'avoir répondu cependant j'ai du mal a utiliser ta réponse.
    Je cherche à comprendre pas à faire. Donc l'utilisation d'une librairie ne m'apportera pas la compréhension souhaité.

    Ensuite tu postes du code mais tu dis que tu n'as pas vraiment lu mon code. Hors mes questions sont en commentaire dans mon code. Donc comment penses-tu répondre à des questions sans les lires.

    Donc retour au point de départs pour ceux qui pourront m'aider à comprendre en apportant des réponses à mes questions.
    Je laisse la discussion ouverte encore un peu.

    Cordialement

  4. #4
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2010
    Messages
    479
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2010
    Messages : 479
    Points : 762
    Points
    762
    Par défaut
    Effectivement je n'avais pas vu tes questions en commentaire dans le code comme tu expliquais ce que tu voulais faire et que le code donné ne semblait pas y répondre j'ai simplement proposé une solution plus facile.. Je ne vois pas trop l'intrêt de comprendre quelque chose qu'on sait pertinemment faux.

    Q1 : on ne vois pas l'image passé en ton constructeur donc dur de répondre.
    Q2 : msdn préconise de passer le PixelFormat du bitmap qui a servi a instancier BitmapData : "En outre, le passage du format de pixel inexact pour une bitmap lèvera un System.ArgumentException." Je ne vois pas l'intérêt de "forcer" cette variable D'ailleurs je ne comprends même pas pourquoi on doit le spécifier. Il devrait le calculer tout seul

    Pour ton buffer de travail tu mets : BmpPixels = new byte[PixelCountSrc * 3]; sauf que Format32bppArgb comporte 4 octets par pixel donc ça va coincer.

    En suite tu ne déverrouilles pas le BitmapData donc là aussi ça va coincer dans tu vas vouloir charger la sortie dans ta PictBox.

    Dans mon poste précédent tu trouveras comment convertir vers le format que tu veux; ou bien simplement récupérer le tableau avec quelques adaptation; mais comme je te dis tu t'embêtes pour rien avec de la manipulation de bas niveau alors qu'il existe des classes qui font déjà cela sans bug.

  5. #5
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Si jamais, cela t'intéresse; il existe une série de 5 exemples microsoftiens sur le traitement d'image.

    https://code.msdn.microsoft.com/site...earchText&ac=5

    Et, traitement d'images ou pas, cela reste une adresse à connaître.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Merci pour vos deux réponses ça me plait mieux.

    Pour lead8209 :
    L’intérêt de comprendre un code pertinemment faux (car il ne fonctionne pas) permet de comprendre son erreur et ne pas la refaire.

    Q1 - L'image que je passe à mon constructeur est l'image de la pictureBox que j'ai placé sur la fenêtre en mode création. On peut lire le format (en désactivé) et je l'ai confirmé en mode debug en faisant un Watch sur la propriété.
    Nom : PropImage.png
Affichages : 225
Taille : 18,1 Ko
    Q2 - J'ai l'impression d’être sur la même longueur d'onde que toi. Il devrait le calculer tout seul en fonction du paramètre sinon à quoi sert le paramètre. Et c'est bien là le sens de ma question pourquoi ne le fait-il pas ?

    Concernant le calcul "BmpPixels = new byte[PixelCountSrc * 3];" ok y'a probablement une erreur 3 ou 4 why not. Si je me base sur Format32bppArgb effectivement c'est 4 mais si je me base sur Format24bppRgb ce sera 3. Je serai probablement en mesure de faire le bon choix quand j'aurai compris ce micmac entre les formats dans les premières lignes de mon code.

    Pour le unlock effectivement ca manque. En fait j'ai essayé de le mettre dans une version antérieur à mon post sans résultat. Donc je l'avais viré mais vais le remettre.

    Pour clementmarcotte :
    Merci pour le lien je vais aller le parcourir de suite.



    Cordialement

  7. #7
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    [CODE]bonjour

    1/Question 1(Q1)La plupart des ctors pour un nouveau bitmap renvoie un bitmap au format de pixel GDI+ =>32bppArgb...
    Celui don't tu as besoin se cache dans un clone du bitmap qui renvoi un bitmap au format Pixel d'origine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      private void LoadImage()
            {
                openFileDialog1.Filter = "Images Files(*.*)|*.*";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    //NOTE AU PASSAGE QUE NOUS AFFECTONS AU PIC SOURCE 
                    //UN IMAGE ET NON LE BMPSRC QUI SERA MODIFIE VIA LE BUFFER DE PIXEL
                    //ET AFFICHE DANS LE PIC DESTINATION...
     
                   picImgSrc.Image=Image.FromFile(openFileDialog1.FileName)  ;
                }
     
            }
    2/ Tu n'as pas besoin d'un besoin d'un bitmap de travail supplementaire ,BMPSRC servira de cobaye et les modifs du buffer de pixel seront repercute sur lui et affiche en Preview....

    3/ Question 2(Q2)...le PixelFormat est fourni au constructeur de Bitmapdata pour calculer le Stride qui servira à dimensionner le buffer de pixel (largeur "hardware reelle" du bitmap qui doit etre un multiple d'un mot(word=4 octets car le bitmap est "blitte" sur la memoire video )...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
      BmpPixels=new Byte[bmpData.Stride*bmpData.Height];
    4/
    // A cet endroit je peut lire que le pixelFormat de BmpTgt est Format32bppArgb.
    // Mais je prendrai la réponse à Q1 ici aussi.
    De ce qui precede cet question devient sans objet,puisque nous utilisons BmpSrc au format d'origine...24bppRgb

    Le code complet modifie et qui mets un image 24bppRgb en niveau de gris:
    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Drawing.Imaging;
    using System.Runtime.InteropServices;
     
    namespace WinImageProcessing
    {
        public partial class FrmProcessImage : Form
        {
     
            public FrmProcessImage()
            {
                InitializeComponent();
                this.picImgSrc.SizeMode = PictureBoxSizeMode.StretchImage;
                this.picImgTgt.SizeMode = PictureBoxSizeMode.StretchImage;
            }
            // Mon objectif ici est d'avoir une Form avec 2 PicturesBox. La premiere affiche l'image de départ (sans traitement).
            // La seconde doit me permettre de visualiser les effets de mon traitement. Entre les deux je souhaite disposer des pixels 
            // dans un tableau en mémoire pour effectuer des operations "matricielle" dessus. 
     
            // picImgSrc est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
            // pmgTgt est une PictureBox. Dans la fenetre Watch de Visual je peut lire que le pixelFormat est Format24bppRgb
            private void btnProcessImage_Click(object sender, EventArgs e)
            {
                LoadImage();
                if (this.picImgSrc.Image == null) return;
     
                Bitmap BmpSrc = null;
                BitmapData bmpData = null;       
                Rectangle   FullImage;
                Byte[] BmpPixels;
     
     
                /* Calcul, creation et initialisation des variables propres à l'image source */
     
                // A cet endroit je peut lire que le pixelFormat de BmpSrc est Format32bppArgb. 
                // Q1 - Savez-vous pourquoi c'est pas le meme que celui de l'image passé en parametre au constructeur ?
     
                //VOICI LA SOLUTION
     
                BmpSrc = this.picImgSrc.Image.Clone() as Bitmap;
     
                this.label1.Text= BmpSrc.PixelFormat.ToString();
                this.label2.Text = Image.GetPixelFormatSize(BmpSrc.PixelFormat).ToString();
     
                FullImage = new Rectangle(0, 0, BmpSrc.Width, BmpSrc.Height);
                bmpData = BmpSrc.LockBits(FullImage, ImageLockMode.ReadWrite,BmpSrc.PixelFormat);
     
                // Ici le LockBits se fait sur une instance qui comporte deja une propriété PixelFormat donc le respecifier ici n'a de sens que pour "Forcer" un format de sortie.
                // Q2 - Ai-je bon ? si non, pourriez-vous m'eclairer ?
                // le "lock"   => fournit le stride moyennant le pixelformat et un Pointer manage(intptr) scan0....
     
                BmpPixels=new Byte[bmpData.Stride*bmpData.Height];
     
                //marshall "aller"
                Marshal.Copy(bmpData.Scan0, BmpPixels, 0, BmpPixels.Length);
     
     
                /* Traitement bidon EN NIVEAU DE GRIS*/
     
                // Get the general color intensity.
                byte maxColor;
                byte minColor;
                byte red, green, blue;
                byte gray;
                for (int i = 0; i < BmpPixels.Length ; i+=3)
                {
                    blue = BmpPixels[i];
                    green = BmpPixels[i + 1];
                    red = BmpPixels[i + 2];
                    maxColor = Math.Max(red, Math.Max(green, blue));
                    minColor = Math.Min(red, Math.Max(green, blue));
                    gray =(byte)( (maxColor + minColor) / 2);
     
                    BmpPixels[i] = gray;  // Blue
                    BmpPixels[i + 1] = gray; // Green
                    BmpPixels[i + 2] = gray;  // Red
     
                }
     
                //marshall "retour"
                Marshal.Copy(BmpPixels, 0, bmpData.Scan0, BmpPixels.Length);
     
                // "unlock" deverouille l'image pour l'afficher
                BmpSrc.UnlockBits(bmpData );
                this.picImgTgt.Image = BmpSrc;
                bmpData = null;
                BmpPixels = null;
     
     
            }
     
            private void LoadImage()
            {
                openFileDialog1.Filter = "Images Files(*.*)|*.*";
                if (openFileDialog1.ShowDialog() == DialogResult.OK)
                {
                    //NOTE AU PASSAGE QUE NOUS AFFECTONS AU PIC SOURCE 
                    //UN IMAGE ET NON LE BMPSRC QUI SERA MODIFIE VIA LE BUFFER DE PIXEL
                    //ET AFFICHE DANS LE PIC DESTINATION...
     
                   picImgSrc.Image=Image.FromFile(openFileDialog1.FileName)  ;
                }
     
            }
        }
    }
    De plus pour information il existe cette function statique qui fournit le nbre de bits (pas bytes) du format de pixel d'un image ou d'un bitmap que j'ai rajoute au code fourni utilise dans le label2:
    ligne.cs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //fournit le nbre de bits par pixel => divise par 8 fournit le nbre de bytes ou octets par pixel
    this.label2.Text = Image.GetPixelFormatSize(BmpSrc.PixelFormat).ToString();
    bon code...

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Décembre 2009
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2009
    Messages : 102
    Points : 66
    Points
    66
    Par défaut
    Bonjour et merci Mabrouki,

    Ton mail est bien structuré et c'est une bonne base de travail pour moi, je vais pouvoir avancer.

    Efficace.

    Trés cordialement,
    Sylvian

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

Discussions similaires

  1. [image processing] gradient
    Par ZaaN dans le forum Traitement d'images
    Réponses: 12
    Dernier message: 10/11/2007, 21h14
  2. Identification d'objet sans 'Image processing toolbox'?
    Par vincent33 dans le forum Images
    Réponses: 1
    Dernier message: 21/09/2007, 15h54
  3. Morphological Image Processing
    Par ImagingAllthe dans le forum Images
    Réponses: 0
    Dernier message: 16/08/2007, 14h46
  4. Réponses: 10
    Dernier message: 01/03/2007, 12h39
  5. Cercle pour image processing
    Par totoc1001 dans le forum Images
    Réponses: 10
    Dernier message: 18/12/2006, 10h20

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