Bmp tasvirining har bir pikseli RGB modelidan (uning uchta komponentidan iborat R - qizil, G - yashil, B - ko'k rangdagi rasm modeli) uning rangi haqida ma'lumot olib boradi. RGB rang qiymatini hex formatida (o'n oltilik) saqlash qulayroqdir, bu erda har bir komponentning qiymati 00… FF oralig'ida bo'ladi. 000000 kombinatsiyasi qora rangga, FFFFFF oq rangga to'g'ri keladi.
Boshlash uchun chizilgan nom maydonini ochamiz:
System. Drawing yordamida;
Bitmap sinfining yangi nusxasini yarataylik:
Bitmap bmp = yangi Bitmap ("c: / 1.bmp") / / c: / 1.bmp - rasm manzili
Piksel rang qiymatini saqlash uchun siz alohida tuzilmani yaratishingiz mumkin, uning maydonlari RGB komponentlari, ammo men Drawing nom maydonidan Color sinfidan foydalanishga qaror qildim. Rangni olish uchun biz GetPixel (x, y) usulidan foydalanamiz, bu erda x, y - rasm pikselining koordinatalari. Agar siz Color sinfining bir nusxasini emas, balki rangni saqlash uchun o'zingizning tuzilishingizdan foydalanmoqchi bo'lsangiz, unda bitta RGB komponentini olish uchun bmp. GetPixel (x, y).x usulidan foydalanishingiz mumkin, bu erda x R, G yoki B
Color [,] color = new Color [bmp. Width, bmp. Height];
uchun (int y = 0; y <bmp. Hight; y ++)
uchun (int x = 0; x <bmp. Width; x ++)
{
rang [x, y] = bmp. GetPixel (x, y);
}
Faylga rang qiymatlarini yozish uchun biz StreamWriter sinfidan foydalanamiz. Color instansiyasining R, G, B elementlari bayt turiga kirganligi sababli, ularni ToString ("X2") usuli yordamida RGB elementlarining olti burchak qiymatlarini saqlaydigan satr turiga o'tkazamiz.
StreamWriter steamWriter = yangi StreamWriter ("c: / 1.txt");
uchun (int y = 0; y <bmp. Hight; y ++)
{
uchun (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (rang [x, y]. R. ToString ("X2"));
steamWriter. Write (rang [x, y]. G. ToString ("X2"));
steamWriter. Write (rang [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
Endi teskari operatsiyani bajaramiz - natijada olingan matnli faylni rasmga aylantiramiz.
StreamReader yordamida biz fayldan ma'lumotlarni o'qiymiz.
StreamReader txtFile = yangi StreamReader ("c: / 1.txt");
Rasmning kengligi va balandligini hisoblaymiz. Har bir piksel 6 ta belgi va 1 ta bo'shliqni olgani uchun va oxirida bo'sh joy bo'lmaganligi sababli, kenglikni hisoblash uchun quyidagi formuladan foydalanamiz:
temp = txtFile. ReadLine ();
width = (temp. Uzunlik + 1) / 7;
Rasm balandligi - bu fayldagi satrlar soni:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
bo'yi ++;
}
bo'yi ++;
Fayldagi o'qish ko'rsatkichini boshiga o'tkazing:
txtFile. DiscardBufferedData ();
Bitmap sinfining yangi nusxasini yarating:
Bitmap bmp2 = yangi Bitmap (kenglik, balandlik);
Split usulidan foydalanib, biz matritsaning elementlarini ajratamiz. Biz bayt turidagi uchta o'zgaruvchini e'lon qilamiz - R, G, B. Parse va Substring usullaridan foydalanib rang elementlarini alohida tanlang.
Rasmdagi pikselni shu rang bilan to'ldirish uchun SetPixel (j, i, Color. FromArgb (R, G, B)) usulidan foydalaning, bu erda j, i rasm koordinatalari, Color. FromArgb (R, G, B) bu strukturani yaratadigan usul Rang.
uchun (int i = 0; i <balandlik; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
uchun (int j = 0; j <kenglik; j + +)
{
R = bayt. Tarse (substring [j]. Substring (0, 2), System. Globalization. NumberStyles. HexNumber)
G = bayt. Tarse (substring [j]. Substring (2, 2),
System. Globalization. NumberStyles. HexNumber)
B = bayt. Parse (substring [j]. Substring (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
Endi siz rasmlarni saqlashingiz mumkin. Agar siz WindowsForm-da ishlayotgan bo'lsangiz, SaveFileDialog sinfidan foydalanishingiz mumkin:
SaveFileDialog saveImage = yangi SaveFileDialog ();
saveImage. Filter = bmp fayllari (*. bmp) | *. bmp | Barcha fayllar (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);