Ang bawat pixel ng isang imahe ng bmp ay nagdadala ng impormasyon tungkol sa kulay nito mula sa modelo ng RGB (ang modelo ng kulay ng imahe, na binubuo ng tatlong bahagi ng R - pula, G - berde, B - asul). Mas madaling mag-imbak ng halaga ng kulay ng RGB sa hex format (hexadecimal), kung saan ang halaga ng bawat bahagi ay nasa saklaw na 00… FF. Ang kumbinasyon na 000000 ay tumutugma sa itim, FFFFFF - sa puti.
Upang magsimula, buksan natin ang namespace ng Pagguhit:
gamit ang System. Pagguhit;
Lumikha tayo ng isang bagong halimbawa ng klase ng Bitmap:
Bitmap bmp = bagong Bitmap ("c: / 1.bmp") / / c: / 1.bmp - imahe address
Upang maiimbak ang halaga ng kulay ng pixel, maaari kang lumikha ng isang magkakahiwalay na istraktura, na ang mga patlang ay mga bahagi ng RGB, ngunit nagpasya akong gamitin ang klase ng Kulay mula sa namespace ng Pagguhit. Upang makuha ang kulay, ginagamit namin ang pamamaraan ng GetPixel (x, y), kung saan ang x, y ay ang mga coordinate ng image pixel. Kung nais mong gumamit ng iyong sariling istraktura upang maiimbak ang kulay, sa halip na isang halimbawa ng klase ng Kulay, maaari mong gamitin ang bmp. GetPixel (x, y).x na pamamaraan upang makakuha ng isang solong sangkap ng RGB, kung saan ang x ay R, G, o B.
Kulay [,] kulay = bagong Kulay [bmp. Width, bmp. Tangkad];
para sa (int y = 0; y <bmp. Taas; y ++)
para sa (int x = 0; x <bmp. Width; x ++)
{
kulay [x, y] = bmp. GetPixel (x, y);
}
Upang isulat ang mga halagang kulay sa isang file, ginagamit namin ang klase ng StreamWriter. Dahil ang mga elemento ng R, G, B ng halimbawa ng Kulay ay nasa uri ng byte, binago namin ang mga ito gamit ang ToString ("X2") na paraan sa isang uri ng string na mag-iimbak ng mga hex na halaga ng mga elemento ng RGB.
StreamWriter steamWriter = bagong StreamWriter ("c: / 1.txt");
para sa (int y = 0; y <bmp. Taas; y ++)
{
para sa (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (kulay [x, y]. R. ToString ("X2"));
steamWriter. Write (kulay [x, y]. G. ToString ("X2"));
steamWriter. Write (kulay [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Isagawa natin ang pabalik na operasyon - i-convert ang nagresultang file ng teksto sa isang imahe.
Sa tulong ng StreamReader nabasa namin ang impormasyon mula sa file.
StreamReader txtFile = bagong StreamReader ("c: / 1.txt");
Kinakalkula namin ang lapad at taas ng imahe. Dahil ang bawat pixel ay tumatagal ng 6 na character at 1 puwang, at walang puwang sa dulo, ginagamit namin ang sumusunod na pormula upang makalkula ang lapad:
temp = txtFile. ReadLine ();
lapad = (temp. Haba + 1) / 7;
Ang taas ng imahe ay ang bilang ng mga linya sa file:
habang (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
taas ++;
}
taas ++;
Ilipat ang read pointer sa file sa simula:
txtFile. DiscardBufferedData ();
Lumikha ng isang bagong halimbawa ng klase ng Bitmap:
Bitmap bmp2 = bagong Bitmap (lapad, taas);
Gamit ang split way, hinati namin ang mga elemento ng matrix. Idineklara namin ang tatlong mga variable ng byte type - R, G, B. Gamit ang mga pamamaraan ng Parse at Substring, hiwalay na piliin ang mga elemento ng kulay.
Upang punan ang pixel sa imahe ng kulay na ito, gamitin ang pamamaraan ng SetPixel (j, i, Kulay. FromArgb (R, G, B)), kung saan ang j, ako ang mga coordinate ng imahe, Kulay. Mula saArgb (R, G, B) ay ang pamamaraan na lumilikha ng Kulay ng istraktura.
para sa (int i = 0; i <taas; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ( );
para sa (int j = 0; j <lapad; 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, Kulay. FromArgb (R, G, B));
}
}
Ngayon ay maaari mong i-save ang mga imahe. Kung nagtatrabaho ka sa WindowsForm maaari mong gamitin ang SaveFileDialog na klase:
SaveFileDialog saveImage = bagong SaveFileDialog ();
saveImage. Filter = bmp files (*. bmp) | *. bmp | Lahat ng mga file (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);