예제 #1
0
        /// <summary>
        /// Redimensionner l'image selon une coefficient multiplicateur
        /// </summary>
        /// <param name="_image">Image à redimensionner</param>
        /// <param name="coefficient">Coefficient de redimentionnement</param>
        /// <returns></returns>
        public static MonImage Redimensionner(MonImage _image, double coefficient)
        {
            MonImage image = new MonImage(_image, true);
            //On redimensionne l'image dans le Header
            //On récupère la dimension initiale
            int hauteur = MonImage.EndianToInt(new byte[] { _image.HeaderInfo[4], _image.HeaderInfo[5], _image.HeaderInfo[6], _image.HeaderInfo[7] });
            int largeur = MonImage.EndianToInt(new byte[] { _image.HeaderInfo[8], _image.HeaderInfo[9], _image.HeaderInfo[10], _image.HeaderInfo[11] });

            //On multiplie par le coefficient demandé
            hauteur = (int)(hauteur * coefficient);
            largeur = (int)(largeur * coefficient);
            //On réajuste afin que la largeur soit un multiple de 4
            largeur += (4 - (largeur % 4)) % 4;
            //On implemente les nouvelles dimensons dans le header
            byte[] Hauteur = MonImage.IntToEndian(hauteur);
            byte[] Largeur = MonImage.IntToEndian(largeur);
            for (int i = 0; i < 4; i++)
            {
                image.HeaderInfo[4 + i] = Hauteur[i];
                image.HeaderInfo[8 + i] = Largeur[i];
            }
            image.Pixel = new byte[hauteur, largeur, 3];
            //On peut maintenant recréer l'image sous les nouvelles dimensions

            for (double i = 0; i < _image.Pixel.GetLength(0); i += 1 / coefficient)
            {
                for (double j = 0; j < _image.Pixel.GetLength(1); j += 1 / coefficient)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        image.Pixel[(int)(i * coefficient), (int)(j * coefficient), k] = _image.Pixel[(int)(i), (int)j, k];
                    }
                }
            }

            return(image);
        }
예제 #2
0
        /// <summary>
        /// Retourne une image de la superposition de deux autres
        /// </summary>
        /// <param name="_image1"></param>
        /// <param name="_image2"></param>
        /// <param name="_x">décalage bas en pixel</param>
        /// <param name="_y">décalage droite en pixel</param>
        /// <returns>Image de superposition associée</returns>
        public static MonImage Superposition(MonImage _image1, MonImage _image2, int _x, int _y)//don't work
        {
            //L'image de retour sera une nouvelle image en partant de _image1
            MonImage imageMax = new MonImage(_image1, true);

            imageMax.HeaderInfo = _image2.HeaderInfo;
            int hauteur = _image2.Pixel.GetLength(0);
            int largeur = _image2.Pixel.GetLength(1);

            //imageMax.ToCompare(_image2);
            //On vérifie _image1 pourra contenir _image2 plus le décalage, sinon on change la taille
            if (_image2.Pixel.GetLength(0) + _x > _image1.Pixel.GetLength(0))
            {
                hauteur += _image2.Pixel.GetLength(0) + _x - _image2.Pixel.GetLength(0);
            }
            if (_x < 0)
            {
                hauteur += _x * (-1);
            }
            if (_image2.Pixel.GetLength(1) + _y > _image1.Pixel.GetLength(1))
            {
                largeur += _image2.Pixel.GetLength(1) + _y - _image2.Pixel.GetLength(1);
            }
            if (_x < 0)
            {
                largeur += _y * (-1);
            }
            //On attribue les bonnes dimensions à l'image 1 même si inchangée (moins de "if" à faire)
            byte[] Hauteur = MonImage.IntToEndian(hauteur);
            byte[] Largeur = MonImage.IntToEndian(largeur);
            for (int i = 0; i < 4; i++)
            {
                imageMax.HeaderInfo[4 + i] = Hauteur[i];
                imageMax.HeaderInfo[8 + i] = Largeur[i];
            }

            //Ne pas oublier chaque ligne multiple de 4
            imageMax.Pixel = new byte[hauteur, largeur + (4 - largeur % 4) % 4, 3];
            //On place d'abord l'image 1
            int min_x = Math.Min(_x, 0);
            int min_y = Math.Min(_y, 0);
            int max_x = Math.Max(_x, 0);
            int max_y = Math.Max(_y, 0);

            for (int i = min_x; i < min_x + _image1.Pixel.GetLength(0); i++)
            {
                for (int j = min_y; j < min_y + _image1.Pixel.GetLength(1); j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        imageMax.Pixel[max_x, max_x, k] = _image1.Pixel[i - min_y, j - min_y, k];
                    }
                }
            }
            //Ensuite on place l'image 2 sachant que le point haute gauche de _image1 est au pixel (m_x, m_y)
            for (int i = min_x + _x; i < min_x + _x + _image2.Pixel.GetLength(0); i++)
            {
                for (int j = min_y + _y; j < min_y + _y + _image2.Pixel.GetLength(1); j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        imageMax.Pixel[i, j, k] = _image2.Pixel[i - min_x - _x, j - min_y - _y, k];
                    }
                }
            }
            return(imageMax);
        }
예제 #3
0
        /// <summary>
        /// Superposition de deux images
        /// </summary>
        /// <param name="_image1"></param>
        /// <param name="_image2"></param>
        public void Superposer(MonImage _image1, MonImage _image2)
        {
            /*MonImage imageMax = new MonImage(_image1, true);
             * imageMax.HeaderInfo = _image2.HeaderInfo;
             * int hauteur = Math.Max(_image1.Pixel.GetLength(0), _image2.Pixel.GetLength(0));
             * int largeur = Math.Max(_image1.Pixel.GetLength(1), _image2.Pixel.GetLength(1));
             * WriteableBitmap bmi2 = new WriteableBitmap(
             *              hauteur, largeur, 11811, 11811, PixelFormats.Bgr24, null);
             * // Copy the data into a one-dimensional array.
             * byte[] pixels1d = new byte[hauteur * largeur * 3];
             * int index = 0;
             * for (int i = 0; i < image.Pixel.GetLength(0); i++)
             * {
             *  for (int j = 0; j < image.Pixel.GetLength(1); j++)
             *  {
             *      for (int k = 0; k < 3; k++)
             *      {
             *          pixels1d[index++] = 0;
             *      }
             *  }
             * }
             * index = 0;
             * for (int i = 0; i < _image1.Pixel.GetLength(0); i++)
             * {
             *  for (int j = 0; j < _image1.Pixel.GetLength(1); j++)
             *  {
             *      for (int k = 0; k < 3; k++)
             *      {
             *          pixels1d[index++] = _image1.Pixel[i, j, k];
             *      }
             *  }
             * }
             * index = 0;
             * for (int i = 0; i < _image2.Pixel.GetLength(0); i++)
             * {
             *  for (int j = 0; j < _image2.Pixel.GetLength(1); j++)
             *  {
             *      for (int k = 0; k < 3; k++)
             *      {
             *          pixels1d[index++] = _image2.Pixel[i, j, k];
             *      }
             *  }
             * }
             * // Update writeable bitmap with the colorArray to the image.
             * Int32Rect rect = new Int32Rect(0, 0, image.Pixel.GetLength(0), image.Pixel.GetLength(1));
             * int stride = 3 * image.Pixel.GetLength(0);
             * bmi2.WritePixels(rect, pixels1d, stride, 0);
             *
             * ImageChangee.Source = bmi2;*/
            //L'image de retour sera une nouvelle image en partant de _image1
            MonImage imageTotale = new MonImage(_image1, true);

            imageTotale.HeaderInfo = _image2.HeaderInfo;
            int      hauteur    = Math.Max(_image1.Pixel.GetLength(0), _image2.Pixel.GetLength(0));
            int      largeur    = Math.Max(_image1.Pixel.GetLength(1), _image2.Pixel.GetLength(1));
            int      hauteurMin = _image1.Pixel.GetLength(0);
            int      largeurMin = _image1.Pixel.GetLength(1);
            MonImage imageMin   = new MonImage(_image1, false);
            MonImage imageMax   = new MonImage(_image2, false);

            if (_image1.Pixel.Length > _image2.Pixel.Length)
            {
                hauteurMin = _image2.Pixel.GetLength(0);
                largeurMin = _image2.Pixel.GetLength(1);
                imageMin   = new MonImage(_image2, false);
                imageMax   = new MonImage(_image1, false);
            }
            //imageMax.ToCompare(_image2);
            //On attribue les bonnes dimensions à l'image 1 même si inchangée (moins de "if" à faire)
            byte[] Hauteur = MonImage.IntToEndian(hauteur);
            byte[] Largeur = MonImage.IntToEndian(largeur);
            for (int i = 0; i < 4; i++)
            {
                imageTotale.HeaderInfo[4 + i] = Hauteur[i];
                imageTotale.HeaderInfo[8 + i] = Largeur[i];
            }
            //On place l'image
            for (int i = 0; i < hauteur; i++)
            {
                for (int j = 0; j < largeur; j++)
                {
                    for (int k = 0; k < 3; k++)
                    {
                        if (i < hauteurMin && j < largeurMin)
                        {
                            imageTotale.Pixel[i, j, k] = imageMin.Pixel[i, j, k];
                        }
                        else if (i < imageMax.Pixel.GetLength(0))
                        {
                            imageTotale.Pixel[i, j, k] = imageMax.Pixel[i, j, k];
                        }
                    }
                }
            }
            _image1 = imageTotale;
            Display(imageTotale);
        }