Bmp кескінінің әр пикселі өзінің түсі туралы ақпаратты RGB моделінен алады (суреттің түсті моделі, үш компоненттен тұрады: R - қызыл, G - жасыл, B - көк). RGB түс мәнін он алтылық форматта (оналтылық) сақтау ыңғайлы, мұнда әр компоненттің мәні 00… FF аралығында болады. 000000 тіркесімі қара, FFFFFF - ақ түске сәйкес келеді.
Бастау үшін Сурет аттарының кеңістігін ашайық:
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. Hyight];
үшін (int y = 0; y <bmp. Hight; y ++)
үшін (int x = 0; x <bmp. Width; x ++)
{
түс [x, y] = bmp. GetPixel (x, y);
}
Файлға түс мәндерін жазу үшін біз StreamWriter класын қолданамыз. Colour данасының R, G, B элементтері байт типті болғандықтан, оларды ToString («X2») әдісі арқылы RGB элементтерінің алтылық мәндерін сақтайтын жол түріне айналдырамыз.
StreamWriter steamWriter = жаңа StreamWriter («c: / 1.txt»);
үшін (int y = 0; y <bmp. Hight; 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 ();
ені = (температура. Ұзындық + 1) / 7;
Кескіннің биіктігі - бұл файлдағы жолдар саны:
while (! 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) - бұл құрылымды жасайтын әдіс.
үшін (int i = 0; i <биіктігі; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
үшін (int j = 0; j <ені; j + +)
{
R = байт. Парс (ішкі жол [j]. Ішкі жол (0, 2), System. Globalization. NumberStyles. HexNumber)
G = байт. Парс (ішкі жол [j]. Ішкі жол (2, 2), System. Globalization. NumberStyles. HexNumber)
B = байт. Парс (ішкі жол [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);