Як конвертувати RGB зображення в текст

Кожен піксель bmp-зображення несе інформацію про свій колір з моделі RGB (колірна модель зображення, яка складається з трьох компонентів R - red, G - green, B - blue). Значення кольору RGB зручніше зберігати в hex форматі (шістнадцятковий), де значення кожної компоненти знаходиться в межах 00 ... FF. Комбінація 000000 - відповідає чорному кольору, FFFFFF - білому.
Як конвертувати RGB зображення в текст


Для початку роботи відкриємо простір імен 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) -


Увага, тільки СЬОГОДНІ!