Bir bmp şəklinin hər pikseli RGB modelindən (R - qırmızı, G - yaşıl, B - mavi üç komponentdən ibarət olan görüntünün rəng modeli) rəngi haqqında məlumat daşıyır. Hər bir komponentin dəyəri 00… FF aralığında olduğu RGB rəng dəyərini hex formatında (onaltılıq) saxlamaq daha rahatdır. 000000 birləşməsi qara, FFFFFF - ağa uyğundur.
Başlamaq üçün Rəsm ad məkanını açaq:
System. Drawing istifadə;
Bitmap sinifinin yeni bir nümunəsini yaradaq:
Bitmap bmp = yeni Bitmap ("c: / 1.bmp") / / c: / 1.bmp - şəkil ünvanı
Piksel rəng dəyərini saxlamaq üçün sahələri RGB komponentləri olan ayrı bir quruluş yarada bilərsiniz, amma Rəsm adından Color sinfindən istifadə etməyə qərar verdim. Rəngi əldə etmək üçün GetPixel (x, y) metodundan istifadə edirik, burada x, y şəkil pikselinin koordinatlarıdır. Rəng sinfinin bir nümunəsini deyil, rəngin saxlanması üçün öz quruluşunuzdan istifadə etmək istəyirsinizsə, x-nin R olduğu tək bir RGB komponenti əldə etmək üçün bmp. GetPixel (x, y).x metodundan istifadə edə bilərsiniz. G və ya B.
Rəng [,] rəng = yeni Rəng [bmp. Width, bmp. Height];
üçün (int y = 0; y <bmp. Height; y ++)
üçün (int x = 0; x <bmp. Width; x ++)
{
rəng [x, y] = bmp. GetPixel (x, y);
}
Bir fayla rəng dəyərləri yazmaq üçün StreamWriter sinifindən istifadə edirik. Color instansiyasının R, G, B elementləri bayt tipli olduğundan, onları ToString ("X2") metodundan istifadə edərək RGB elementlərinin hex dəyərlərini saxlayacaq bir simli tipə çeviririk.
StreamWriter steamWriter = yeni StreamWriter ("c: / 1.txt");
üçün (int y = 0; y <bmp. Height; y ++)
{
üçün (int x = 0; x <bmp. Width; x ++)
{
steamWriter. Write (rəng [x, y]. R. ToString ("X2"));
steamWriter. Write (rəng [x, y]. G. ToString ("X2"));
steamWriter. Write (rəng [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
İndi tərs əməliyyatı həyata keçirək - nəticədə çıxan mətn sənədini şəkilə çevirin.
StreamReader köməyi ilə sənəddən məlumat oxuyuruq.
StreamReader txtFile = yeni StreamReader ("c: / 1.txt");
Görüntünün genişliyini və hündürlüyünü hesablayırıq. Hər piksel 6 simvol və 1 boşluq aldığından və sonunda boşluq olmadığından genişliyi hesablamaq üçün aşağıdakı düsturdan istifadə edirik:
temp = txtFile. ReadLine ();
eni = (temp. Uzunluq + 1) / 7;
Şəkil hündürlüyü fayldakı sətirlərin sayıdır:
while (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
boy ++;
}
boy ++;
Fayldakı oxu göstəricisini əvvəlinə aparın:
txtFile. DiscardBufferedData ();
Bitmap sinifinin yeni bir nümunəsini yaradın:
Bitmap bmp2 = yeni Bitmap (genişlik, hündürlük);
Split metodundan istifadə edərək matrisanın elementlərini böldük. Bayt tipli üç dəyişəni elan edirik - R, G, B. Parse və Substring metodlarından istifadə edərək rəng elementlərini ayrıca seçin.
Şəkildəki pikseli bu rənglə doldurmaq üçün SetPixel (j, i, Color. FromArgb (R, G, B)) metodundan istifadə edin, burada j, i şəkil koordinatları, Color. FromArgb (R, G, B) Rəng quruluşunu yaradan metoddur.
üçün (int i = 0; i <hündürlük; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
üçün (int j = 0; j <en; j + +)
{
R = byte. Parse (substring [j]. Substring (0, 2), System. Globalization. NumberStyles. HexNumber)
G = bayt. Parse (alt sətir [j]. Sətir (2, 2), System. Globalization. NumberStyles. HexNumber)
B = bayt. Parse (alt sətir [j]. Sətir (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
İndi şəkilləri saxlaya bilərsiniz. WindowsForm-da işləyirsinizsə, SaveFileDialog sinifindən istifadə edə bilərsiniz:
SaveFileDialog saveImage = yeni SaveFileDialog ();
saveImage. Filter = bmp faylları (*. bmp) | *. bmp | Bütün sənədlər (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);