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