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

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

Видео: Как да конвертирате RGB изображения в текст

Видео: Как да конвертирате RGB изображения в текст
Видео: Как перевести картинку в текст 2024, Може
Anonim

Всеки пиксел на bmp изображение носи информация за цвета си от RGB модела (цветният модел на изображението, който се състои от три компонента R - червен, G - зелен, B - син). По-удобно е да съхранявате RGB цветна стойност в шестнадесетичен формат (шестнадесетичен), където стойността на всеки компонент е в диапазона 00 … FF. Комбинацията 000000 отговаря на черно, FFFFFF - на бяло.

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

За да започнем, нека отворим пространството от имена на Drawing:

използване на System. Drawing;

Нека създадем нов екземпляр на класа Bitmap:

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

За да съхраните стойността на цвета на пиксела, можете да създадете отделна структура, чиито полета са RGB компоненти, но реших да използвам клас Color от пространството от имена Drawing. За да получим цвета, използваме метода GetPixel (x, y), където x, y са координатите на пиксела на изображението. Ако искате да използвате собствена структура за съхраняване на цвета, а не екземпляр от клас Color, тогава можете да използвате метода bmp. GetPixel (x, y).x, за да получите един RGB компонент, където x е R, G или B.

Цвят [,] цвят = нов Цвят [bmp. Width, bmp. Height];

за (int y = 0; y <bmp. Height; y ++)

за (int x = 0; x <bmp. Width; x ++)

{

цвят [x, y] = bmp. GetPixel (x, y);

}

За да запишем цветови стойности във файл, използваме класа StreamWriter. Тъй като елементите R, G, B на екземпляра Color са от тип байт, ние ги преобразуваме с помощта на метода ToString ("X2") в тип низ, който ще съхранява шестнадесетичните стойности на RGB елементите.

StreamWriter steamWriter = нов StreamWriter ("c: / 1.txt");

за (int y = 0; y <bmp. Height; y ++)

{

за (int x = 0; x <bmp. Width; x ++)

{

steamWriter. Write (цвят [x, y]. R. ToString ("X2"));

steamWriter. Write (цвят [x, y]. G. ToString ("X2"));

steamWriter. Write (цвят [x, y]. B. ToString ("X2") + ");

}

steamWriter. WriteLine ();

}

steamWriter. Close ();

Сега нека извършим обратната операция - конвертираме получения текстов файл в изображение.

С помощта на StreamReader четем информация от файла.

StreamReader txtFile = нов StreamReader ("c: / 1.txt");

Изчисляваме ширината и височината на изображението. Тъй като всеки пиксел отнема 6 знака и 1 празнина и няма празнина в края, използваме следната формула за изчисляване на ширината:

temp = txtFile. ReadLine ();

ширина = (temp. Length + 1) / 7;

Височината на изображението е броят на редовете във файла:

докато (! txtFile. EndOfStream)

{

txtFile. ReadLine ();

височина ++;

}

височина ++;

Преместете показалеца за четене във файла в началото:

txtFile. DiscardBufferedData ();

Създайте нов екземпляр на класа Bitmap:

Bitmap bmp2 = ново Bitmap (ширина, височина);

Използвайки метода на разделяне, ние разделяме елементите на матрицата. Декларираме три променливи от типа байт - R, G, B. Използвайки методите Parse и Substring, изберете цветовите елементи поотделно.

За да запълните пиксела в изображението с този цвят, използвайте метода SetPixel (j, i, Color. FromArgb (R, G, B)), където j, i са координатите на изображението, Color. FromArgb (R, G, B) е методът, който създава структурата Color.

за (int i = 0; i <височина; i + +)

{

temp = txtFile2. ReadLine ();

низ подниза = temp. Split ('');

за (int j = 0; j <ширина; j + +)

{

R = байт. Parse (подниз [j]. Подниз (0, 2), System. Globalization. NumberStyles. HexNumber)

G = байт. Parse (подниз [j]. Подниз (2, 2), System. Globalization. NumberStyles. HexNumber)

B = байт. Parse (подниз [j]. Подниз (4, 2), System. Globalization. NumberStyles. HexNumber)

bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));

}

}

Сега можете да запазите изображенията. Ако работите в WindowsForm, можете да използвате класа SaveFileDialog:

SaveFileDialog saveImage = нов SaveFileDialog ();

saveImage. Filter = bmp файлове (*. bmp) | *. bmp | Всички файлове (*. *)

| *. * ;

saveImage. ShowDialog ();

bmp2. Save (saveImage. FileName);

Препоръчано: