/// <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); }
/// <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); }
/// <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); }