Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Конвертация bmp изображения в матрицу и обратно для последующей обработки

Anna | 17.06.2014 | нет комментариев

 

В данной статье я опишу метод реформирования изображения bmp в матрицу, элементами которой будут значения цветов всякого пикселя.

 

image

 

Всякий пиксель bmp — изображения несет информацию о своем цвете из модели RGB (цветовая модель изображения, которая состоит из 3 компонентов R — red, G — green, B — blue). Значение всякой компоненты RGB может быть в пределах 0… 255. Это дает вероятность закодировать 255*255*255 цветов.

Значение цвета RGB комфортнее беречь в hex формате ( шестнадцатерично ), где значение всякой компоненты находятся в пределах 00… FF. Комбинация 000000 — соответствует черному цвету, FFFFFF — белому.

Для начала работы откроем пространство имен Drawing:

   using System.Drawing ;

Сделаем новейший экземпляр класса Bitmap:

  Bitmap bmp = new Bitmap ( " c :  1.bmp " ) / / c :  1.bmp - адрес изображения

Для хранения значения цвета пикселя дозволено сделать отдельную конструкцию, полями которой будут компоненты RGB, но я решил применять класс Color из пространства имен Drawing. Для приобретения цвета используем способ GetPixel( x, y ), где x, y — координаты пикселя изображения. Если вы хотите применять собственную конструкцию для хранения цвета, а не экземпляр класса Color, тогда для приобретения отдельной компоненты RGB дозволено применять способ bmp.GetPixel(x, y).x, где x – R, G либо B.

  Color[,] color = new Color[bmp.Width, bmp.Height];
  for (int y = 0; y < bmp.Height; y  )
       for (int x = 0; x < bmp.Width; x  )
       {
          color[x, y] = bmp.GetPixel(x, y); 
       }


Для записи значений цветов в файл используем класс StreamWriter. От того что элементы R, G, B экземпляра Color имеют тип byte то конвертируем их с поддержкой способа ToString («X2») в string тип, тот, что будет сберегать hex значения элементов RGB.

StreamWriter steamWriter = new StreamWriter("c:1.txt");
 for (int y = 0; y < bmp.Height; y  )
 {
      for (int x = 0; x < bmp.Width; x  )
      {
           steamWriter.Write(color[x, y].R.ToString("X2"));
           steamWriter.Write(color[x, y].G.ToString("X2"));
           steamWriter.Write(color[x, y].B.ToString("X2")   " ");
       }
       steamWriter.WriteLine();
  }
  steamWriter.Close();
      

Сейчас проведем обратную операцию — конвертируем полученный текстовый файл в изображение.
С поддержкой StreamReader ми считаем информацию из файла.

  StreamReader txtFile = new StreamReader ( " c :  1.txt " ) ;
  

Вычисляем ширину и высоту изображения. От того что всякий пиксель занимает 6 символов и 1 пропуск, а в конце пропуска нет, то для вычисления ширины используем следующую формулу:

   temp = txtFile.ReadLine ();
   width = ( temp.Length   1) / 7 ;
  

Высота изображения — это число строк в файле:

   while (! txtFile.EndOfStream )
   {
          txtFile.ReadLine ();
          height  ;
    }
    height  ;
       

Передвигаем указатель считывания в файле на предисловие:

   txtFile.DiscardBufferedData ();
   

Создаем новейший экземпляр класса Bitmap:

   Bitmap bmp2 = new Bitmap ( width , height ) ;
   

С поддержкой способа split разделяем элементы матрицы. Объявляем три переменных типа byte — R, G, B. С поддержкой способов Parse и Substring выделяем отдельно элементы цвета.

Для заполнения пикселя в изображение данным цветом используем способ SetPixel ( j, i, Color.FromArgb ( R, G, B )), где j, i — координаты изображения, Color.FromArgb ( R, G, B ) — способ тот, что создает конструкцию Color.

   for ( int i = 0 ; i < height ; i    )
   {
          temp = txtFile2.ReadLine ();
          string [ ] substring = temp.Split (' ');

           for ( int j = 0 ; j < width ; j    )
           {
                R = byte.Parse ( substring [ j ] . Substring ( 0 , 2 ) ,
                        System.Globalization.NumberStyles.HexNumber )
                G = byte.Parse ( substring [ j ] . Substring ( 2, 2 ) , 
                       System.Globalization.NumberStyles.HexNumber )
                 B = byte.Parse ( substring [ j ] . Substring ( 4 , 2 ) , 
                        System.Globalization.NumberStyles.HexNumber )
                 bmp2.SetPixel ( j , i , Color.FromArgb ( R , G , B )) ;
             }
      }

Сейчас дозволено сберечь изображения. Если трудитесь в WindowsForm можете применять класс SaveFileDialog:

   SaveFileDialog saveImage = new SaveFileDialog ();
    saveImage.Filter = " bmp files (*. bmp ) | * . bmp | All files (*. * )
                       | * . * " ;
    saveImage.ShowDialog ();
    bmp2.Save (saveImage.FileName);

 

 Источник: programmingmaster.ru
Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB