Bmp სურათის თითოეული პიქსელი ატარებს ინფორმაციას მისი ფერის შესახებ RGB მოდელიდან (სურათის ფერადი მოდელი, რომელიც შედგება სამი კომპონენტისგან R - წითელი, G - მწვანე, B - ლურჯი). უფრო მოსახერხებელია RGB ფერის მნიშვნელობის შენახვა თექვსმეტ ფორმატში (თექვსმეტობითი), სადაც თითოეული კომპონენტის მნიშვნელობა არის 00… FF დიაპაზონში. კომბინაცია 000000 შეესაბამება შავს, FFFFFF - თეთრს.
დასაწყებად, მოდით გავხსნათ Drawing namespace:
გამოყენებით System. Drawing;
მოდით შევქმნათ Bitmap კლასის ახალი ინსტანცია:
Bitmap bmp = new Bitmap ("c: / 1.bmp") / / c: / 1.bmp - სურათის მისამართი
პიქსელის ფერის მნიშვნელობის შესანახად შეგიძლიათ შექმნათ ცალკე სტრუქტურა, რომლის ველები RGB კომპონენტებია, მაგრამ მე გადავწყვიტე გამომეყენებინა ფერების კლასი Drawing namespace- დან. ფერის მისაღებად ვიყენებთ GetPixel (x, y) მეთოდს, სადაც x, y გამოსახულების პიქსელის კოორდინატებია. თუ გსურთ გამოიყენოთ თქვენი სტრუქტურა ფერის შესანახად, და არა ფერის კლასის ინსტანციისთვის, შეგიძლიათ გამოიყენოთ bmp. GetPixel (x, y).x მეთოდი ერთი RGB კომპონენტის მისაღებად, სადაც x არის R, G, ან B.
ფერი [,] ფერი = ახალი ფერი [bmp. Width, bmp. Hight];
for (int y = 0; y <bmp. სიმაღლე; y ++)
ამისთვის (int x = 0; x <bmp. სიგანე; x ++)
{
ფერი [x, y] = bmp. GetPixel (x, y);
}
ფაილში ფერის მნიშვნელობების დასაწერად ვიყენებთ StreamWriter კლასს. ვინაიდან Color ინსტანციის R, G, B ელემენტები ბაიტის ტიპისაა, ჩვენ მათ ToString ("X2") მეთოდის გამოყენებით ვაქცევთ სტრიქონის ტიპად, რომელიც ინახავს RGB ელემენტების თექვსმეტ მნიშვნელობებს.
StreamWriter steamWriter = new StreamWriter ("c: / 1.txt");
for (int y = 0; y <bmp. სიმაღლე; y ++)
{
ამისთვის (int x = 0; x <bmp. სიგანე; x ++)
{
steamWriter. Write (ფერი [x, y]. R. ToString ("X2"));
steamWriter. Write (ფერი [x, y]. G. ToString ("X2"));
steamWriter. Write (ფერი [x, y]. B. ToString ("X2") + ");
}
steamWriter. WriteLine ();
}
steamWriter. Close ();
ახლა მოდით, შევასრულოთ საპირისპირო ოპერაცია - შედეგად ტექსტური ფაილი გადავაკეთოთ სურათად.
StreamReader- ის დახმარებით ჩვენ ვკითხულობთ ინფორმაციას ფაილიდან.
StreamReader txtFile = new StreamReader ("c: / 1.txt");
ჩვენ გამოვთვლით სურათის სიგანეს და სიმაღლეს. მას შემდეგ, რაც თითოეულ პიქსელს აქვს 6 სიმბოლო და 1 უფსკრული, და ბოლოს არ არის ხარვეზი, სიგანის გამოსათვლელად გამოვიყენებთ შემდეგ ფორმულას:
temp = txtFile. ReadLine ();
სიგანე = (ტემპი სიგრძე + 1) / 7;
სურათის სიმაღლე არის ფაილში ხაზების რაოდენობა:
ხოლო (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
სიმაღლე ++;
}
სიმაღლე ++;
წაიკითხეთ წაკითხვის მაჩვენებელი ფაილში დასაწყისში:
txtFile. DiscardBufferedData ();
შექმენით Bitmap კლასის ახალი ინსტანცია:
Bitmap bmp2 = ახალი Bitmap (სიგანე, სიმაღლე);
გაყოფილი მეთოდის გამოყენებით, ჩვენ დავყოფთ მატრიცის ელემენტებს. ვაცხადებთ ბაიტის ტიპის სამ ცვლადს - R, G, B. Parse და Substring მეთოდების გამოყენებით, ცალკე შეარჩიეთ ფერის ელემენტები.
სურათის პიქსელის შევსების მიზნით გამოიყენეთ SetPixel (j, i, Color. FromArgb (R, G, B)) მეთოდი, სადაც j, i არის სურათის კოორდინატები, ფერი. FromArgb (R, G, B) არის მეთოდი, რომელიც ქმნის სტრუქტურას Color.
for (int i = 0; i <სიმაღლე; i + +)
{
temp = txtFile2. ReadLine ();
string substring = temp. Split ('');
for (int j = 0; j <სიგანე; j + +)
{
R = ბაიტი. Parse (ქვესტრიქონი [j]. ქვესტრიქონი (0, 2), System. Globalization. NumberStyles. HexNumber)
G = ბაიტი. Parse (ქვესტრიქონი [j]. ქვესტრიქონი (2, 2), System. Globalization. NumberStyles. HexNumber)
B = ბაიტი. Parse (ქვესტრიქონი [j]. ქვესტრიქონი (4, 2),
System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, ფერი. FromArgb (R, G, B));
}
}
ახლა სურათების შენახვა შეგიძლიათ. თუ WindowsForm– ში მუშაობთ, შეგიძლიათ გამოიყენოთ SaveFileDialog კლასი:
SaveFileDialog saveImage = ახალი SaveFileDialog ();
saveImage. Filter = bmp ფაილი (*. bmp) | *. bmp | ყველა ფაილი (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. შენახვა (saveImage. FileName);