Как конвертировать RGB изображения в текст?

3 ноября 2014 г. Просмотров: 806 Инструкции

Каждый пиксель bmp-изображения несет информацию о своем цвете из модели RGB (цветовая модель изображения, которая состоит из трех компонентов R — red, G — green, B — blue). Значение цвета 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);

Оцените статью!