A bmp kép minden pixelje az RGB modellből (a kép színmodellje, amely három R - piros, G - zöld, B - kék) áll. Kényelmesebb tárolni az RGB színértéket hex formátumban (hexadecimális), ahol az egyes komponensek értéke 00… FF tartományban van. A 000000 kombináció a feketének, az FFFFFF - a fehérnek felel meg.
A kezdéshez nyissuk meg a Rajz névterét:
a System. Drawing;
Hozzunk létre egy új példányt a Bitmap osztályból:
Bitmap bmp = new Bitmap ("c: / 1.bmp") / / c: / 1.bmp - kép címe
A pixel színértékének tárolásához külön struktúrát hozhat létre, amelynek mezői RGB komponensek, de úgy döntöttem, hogy a Szín osztályt használom a Rajz névtérből. A szín megszerzéséhez a GetPixel (x, y) módszert alkalmazzuk, ahol x, y a képpont koordinátái. Ha a szín tárolásához a saját struktúráját szeretné használni, a Color osztály példánya helyett, akkor a bmp. GetPixel (x, y).x módszerrel egyetlen RGB komponenst kaphat, ahol x R, G vagy B.
Szín [,] szín = új Szín [bmp.szélesség, bmp. Height];
mert (int y = 0; y <bmp. Magasság; y ++)
for (int x = 0; x <bmp.szélesség; x ++)
{
szín [x, y] = bmp. GetPixel (x, y);
}
Színértékek fájlba írásához a StreamWriter osztályt használjuk. Mivel a Színpéldány R, G, B elemei bájt típusúak, a ToString ("X2") módszerrel átalakítjuk azokat egy karaktersorozat típusgá, amely tárolja az RGB elemek hex értékeit.
StreamWriter steamWriter = új StreamWriter ("c: / 1.txt");
mert (int y = 0; y <bmp. Magasság; y ++)
{
for (int x = 0; x <bmp.szélesség; x ++)
{
steamWriter. Write (szín [x, y]. R. ToString ("X2"));
steamWriter. Write (szín [x, y]. G. ToString ("X2"));
steamWriter. Write (szín [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Most végezzük el a fordított műveletet - konvertáljuk a kapott szöveges fájlt képpé.
A StreamReader segítségével információkat olvasunk le a fájlból.
StreamReader txtFile = új StreamReader ("c: / 1.txt");
Kiszámoljuk a kép szélességét és magasságát. Mivel minden pixel 6 karaktert és 1 rést vesz igénybe, és a végén nincs hézag, a következő képletet használjuk a szélesség kiszámításához:
temp = txtFile. ReadLine ();
szélesség = (temp. Hossz + 1) / 7;
A kép magassága a fájl sorainak száma:
míg (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
magasság ++;
}
magasság ++;
Vigye a fájl olvasási mutatóját az elejére:
txtFile. DiscardBufferedData ();
Hozzon létre egy új példányt a Bitmap osztályból:
Bitmap bmp2 = új Bitmap (szélesség, magasság);
A felosztási módszer segítségével felosztjuk a mátrix elemeit. Három byte típusú változót deklarálunk - R, G, B. A Parse és az Substring módszerekkel külön válasszuk ki a színelemeket.
Ha a kép pixelét ezzel a színnel szeretné kitölteni, használja a SetPixel (j, i, Color. FromArgb (R, G, B)) módszert, ahol j, i a kép koordinátái, Color. FromArgb (R, G, B) a színszerkezetet létrehozó módszer.
for (int i = 0; i <magasság; i + +)
{
temp = txtFile2. ReadLine ();
string szubsztring = temp. Split ('');
for (int j = 0; j <szélesség; j + +)
{
R = bájt. Parse (sztring [j]. Substring (0, 2), System. Globalization. NumberStyles. HexNumber)
G = bájt. Parse (sztring [j]. Alstring (2, 2), System. Globalization. NumberStyles. HexNumber)
B = bájt. Parse (sztring [j]. Substring (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Most elmentheti a képeket. Ha WindowsFormban dolgozik, használhatja a SaveFileDialog osztályt:
SaveFileDialog saveImage = new SaveFileDialog ();
saveImage. Filter = bmp fájlok (*. bmp) | *. bmp | Minden fájl (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);