Як конвертувати 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.jpg " ) / / C: 1.jpg - адреса зображення


Для зберігання значення кольору пікселя можна створити окрему структуру, полями якої будуть компоненти 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 lt; bmp.Height- y ++)
for (int x = 0 x lt; 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 lt; bmp.Height- y ++)
{
for (int x = 0 x lt; 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 lt; height - i + +)
{
temp = txtFile2.ReadLine () -
string [] substring = temp.Split ( ``);

for (int j = 0 - j lt; 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) -



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


Оцініть, будь ласка статтю
Всього голосів: 187
Увага, тільки СЬОГОДНІ!