Kila pikseli ya picha ya bmp hubeba habari juu ya rangi yake kutoka kwa mfano wa RGB (mfano wa rangi ya picha hiyo, ambayo ina vifaa vitatu R - nyekundu, G - kijani, B - bluu). Ni rahisi zaidi kuhifadhi rangi ya rangi ya RGB katika muundo wa hex (hexadecimal), ambapo thamani ya kila sehemu iko katika anuwai ya 00… FF. Mchanganyiko 000000 inalingana na nyeusi, FFFFFF - nyeupe.
Ili kuanza, wacha tufungue nafasi ya jina la Kuchora:
kutumia Mfumo. Kuchora;
Wacha tuunde mfano mpya wa darasa la Bitmap:
Bitmap bmp = Bitmap mpya ("c: / 1.bmp") / / c: / 1.bmp - anwani ya picha
Ili kuhifadhi thamani ya rangi ya pikseli, unaweza kuunda muundo tofauti, ambao uwanja wake ni vifaa vya RGB, lakini niliamua kutumia darasa la Rangi kutoka nafasi ya jina ya Kuchora. Ili kupata rangi, tunatumia njia ya GetPixel (x, y), ambapo x, y ni uratibu wa pikseli ya picha. Ikiwa unataka kutumia muundo wako mwenyewe kuhifadhi rangi, badala ya mfano wa darasa la Rangi, basi unaweza kutumia bmp. GetPixel (x, y).x njia kupata sehemu moja ya RGB, ambapo x ni R, G, au B.
Rangi [,] rangi = Rangi mpya [bmp. Upana, bmp. Urefu];
kwa (int y = 0; y <bmp. Urefu; y ++)
kwa (int x = 0; x <bmp. Upana; x ++)
{
rangi [x, y] = bmp. GetPixel (x, y);
}
Kuandika maadili ya rangi kwenye faili, tunatumia darasa la StreamWriter. Kwa kuwa vipengee vya R, G, B vya mfano wa Rangi ni vya aina ya byte, tunawabadilisha kwa kutumia njia ya ToString ("X2") kuwa aina ya kamba ambayo itahifadhi maadili ya hex ya vitu vya RGB.
StreamWriter steamWriter = mpya StreamWriter ("c: / 1.txt");
kwa (int y = 0; y <bmp. Urefu; y ++)
{
kwa (int x = 0; x <bmp. Upana; x ++)
{
stimaWriter.andika (rangi [x, y]. R. ToString ("X2"));
SteamWriter. Andika (rangi [x, y]. G. ToString ("X2"));
steamWriter. Andika (rangi [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
Mwandishi Mwandishi Funga ();
Sasa wacha tufanye operesheni ya nyuma - badilisha faili ya maandishi kusababisha picha.
Kwa msaada wa StreamReader tunasoma habari kutoka kwa faili.
StreamReader txtFile = mpya StreamReader ("c: / 1.txt");
Tunahesabu upana na urefu wa picha. Kwa kuwa kila pikseli huchukua herufi 6 na pengo 1, na hakuna pengo mwishoni, tunatumia fomula ifuatayo kuhesabu upana:
temp = txtFile. ReadLine ();
upana = (temp. Urefu + 1) / 7;
Urefu wa picha ni idadi ya mistari kwenye faili:
wakati (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
urefu ++;
}
urefu ++;
Sogeza kiashiria cha kusoma kwenye faili hadi mwanzo:
txtFile. DiscardBufferedData ();
Unda mfano mpya wa darasa la Bitmap:
Bitmap bmp2 = Bitmap mpya (upana, urefu);
Kutumia njia ya kugawanyika, tunagawanya vitu vya tumbo. Tunatangaza vigeuzi vitatu vya aina ya baiti - R, G, B. Kutumia njia za Parse na Substring, chagua vitu vya rangi kando.
Ili kujaza pikseli kwenye picha na rangi hii, tumia njia ya SetPixel (j, i, Colour. FromArgb (R, G, B)), ambapo j, i ni picha za kuratibu, Rangi. ni njia ambayo huunda muundo wa Rangi.
kwa (int i = 0; i <urefu; i + +)
{
temp = txtFile2. ReadLine ();
kamba substring = temp. Split ('');
kwa (int j = 0; j <upana; j + +)
{
R = baiti. Sehemu (substring [j]. Substring (0, 2), Mfumo. Utandawazi. NumberStyles. HexNumber)
G = byte. Sehemu (substring [j]. Substring (2, 2), Mfumo. Utandawazi. NumberStyles. HexNumber)
B = baiti. Sehemu (substring [j]. Substring (4, 2), Mfumo. Utandawazi. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Rangi. KutokaArgb (R, G, B));
}
}
Sasa unaweza kuhifadhi picha. Ikiwa unafanya kazi katika WindowsForm unaweza kutumia darasa la SaveFileDialog:
SaveFileDialog saveImage = mpya SaveFileDialog ();
saveImage. Filter = faili za bmp (*. bmp) | *. bmp | Faili zote (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);