แต่ละพิกเซลของภาพ bmp จะมีข้อมูลเกี่ยวกับสีของมันจากโมเดล RGB (โมเดลสีของรูปภาพซึ่งประกอบด้วยสามองค์ประกอบ R - แดง, G - เขียว, B - น้ำเงิน) สะดวกกว่าในการจัดเก็บค่าสี RGB ในรูปแบบฐานสิบหก (ฐานสิบหก) โดยที่ค่าของแต่ละองค์ประกอบอยู่ในช่วง 00… FF ชุดค่าผสม 000000 สอดคล้องกับสีดำ FFFFFF - เป็นสีขาว
ในการเริ่มต้น ให้เปิดเนมสเปซการวาด:
ใช้ System. Drawing;
มาสร้างอินสแตนซ์ใหม่ของคลาส Bitmap:
Bitmap bmp = บิตแมปใหม่ ("c: / 1.bmp") / / c: / 1.bmp - ที่อยู่รูปภาพ
ในการจัดเก็บค่าสีพิกเซล คุณสามารถสร้างโครงสร้างแยกกัน ซึ่งมีฟิลด์เป็นส่วนประกอบ RGB แต่ฉันตัดสินใจใช้คลาสสีจากเนมสเปซการวาด เพื่อให้ได้สี เราใช้เมธอด GetPixel (x, y) โดยที่ x, y คือพิกัดของพิกเซลของภาพ หากคุณต้องการใช้โครงสร้างของคุณเองในการจัดเก็บสี แทนที่จะเป็นอินสแตนซ์ของคลาส Color คุณสามารถใช้เมธอด bmp. GetPixel (x, y).x เพื่อรับองค์ประกอบ RGB เดียว โดยที่ x คือ R G หรือ B
สี [,] สี = สีใหม่ [bmp. Width, bmp. Height];
สำหรับ (int y = 0; y <bmp. Height; y ++)
สำหรับ (int x = 0; x <bmp. Width; x ++)
{
สี [x, y] = bmp. GetPixel (x, y);
}
ในการเขียนค่าสีลงในไฟล์ เราใช้คลาส StreamWriter เนื่องจากองค์ประกอบ R, G, B ของอินสแตนซ์ Color เป็นประเภทไบต์ เราจึงแปลงโดยใช้วิธี ToString ("X2") เป็นประเภทสตริงที่จะเก็บค่าฐานสิบหกขององค์ประกอบ RGB
StreamWriter steamWriter = StreamWriter ใหม่ ("c: / 1.txt");
สำหรับ (int y = 0; y <bmp. Height; y ++)
{
สำหรับ (int x = 0; x <bmp. Width; 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.ปิด ();
ตอนนี้ มาดำเนินการย้อนกลับ - แปลงไฟล์ข้อความที่ได้เป็นรูปภาพ
ด้วยความช่วยเหลือของ StreamReader เราอ่านข้อมูลจากไฟล์
StreamReader txtFile = StreamReader ใหม่ ("c: / 1.txt");
เราคำนวณความกว้างและความสูงของภาพ เนื่องจากแต่ละพิกเซลใช้อักขระ 6 ตัวและ 1 ช่องว่าง และไม่มีช่องว่างในตอนท้าย เราใช้สูตรต่อไปนี้ในการคำนวณความกว้าง:
temp = txtFile. ReadLine ();
width = (temp. Length + 1) / 7;
ความสูงของรูปภาพคือจำนวนบรรทัดในไฟล์:
ในขณะที่ (! txtFile. EndOfStream)
{
txtFile. ReadLine ();
ความสูง ++;
}
ความสูง ++;
ย้ายตัวชี้การอ่านในไฟล์ไปที่จุดเริ่มต้น:
txtFile. DiscardBufferedData ();
สร้างอินสแตนซ์ใหม่ของคลาส Bitmap:
Bitmap bmp2 = บิตแมปใหม่ (ความกว้าง ความสูง);
โดยใช้วิธีการแยก เราแยกองค์ประกอบของเมทริกซ์ เราประกาศตัวแปรสามตัวของประเภทไบต์ - R, G, B. โดยใช้วิธี Parse และ Substring เลือกองค์ประกอบสีแยกกัน
ในการเติมพิกเซลในภาพด้วยสีนี้ ให้ใช้ SetPixel (j, i, Color. FromArgb (R, G, B)) โดยที่ j, i คือพิกัดของภาพ Color. FromArgb (R, G, B) เป็นวิธีการที่สร้างโครงสร้างสี
สำหรับ (int i = 0; i <height; i + +)
{
temp = txtFile2. ReadLine ();
สตริง สตริงย่อย = temp. Split ('');
สำหรับ (int j = 0; j <ความกว้าง; j + +)
{
R = byte. Parse (สตริงย่อย [j]. สตริงย่อย (0, 2), System. Globalization. NumberStyles. HexNumber)
G = byte. Parse (สตริงย่อย [j] สตริงย่อย (2, 2), System. Globalization. NumberStyles. HexNumber)
B = byte. Parse (สตริงย่อย [j] สตริงย่อย (4, 2), System. Globalization. NumberStyles. HexNumber)
bmp2. SetPixel (j, i, Color. FromArgb (R, G, B));
}
}
ตอนนี้คุณสามารถบันทึกภาพ หากคุณกำลังทำงานใน WindowsForm คุณสามารถใช้คลาส SaveFileDialog:
SaveFileDialog saveImage = ใหม่ SaveFileDialog ();
saveImage. Filter = ไฟล์ bmp (*. bmp) | *. bmp | ไฟล์ทั้งหมด (*. *)
| *. * ;
saveImage. ShowDialog ();
bmp2. Save (saveImage. FileName);