วิธีแปลงภาพ RGB เป็นข้อความ

วิธีแปลงภาพ RGB เป็นข้อความ
วิธีแปลงภาพ RGB เป็นข้อความ

วีดีโอ: วิธีแปลงภาพ RGB เป็นข้อความ

วีดีโอ: วิธีแปลงภาพ RGB เป็นข้อความ
วีดีโอ: แปลงรูปภาพเป็นข้อความ ไม่ต้องพิมพ์ให้เมื่อยจ้า ทำง่าย ๆ ภายใน 1 นาที 2024, อาจ
Anonim

แต่ละพิกเซลของภาพ bmp จะมีข้อมูลเกี่ยวกับสีของมันจากโมเดล RGB (โมเดลสีของรูปภาพซึ่งประกอบด้วยสามองค์ประกอบ R - แดง, G - เขียว, B - น้ำเงิน) สะดวกกว่าในการจัดเก็บค่าสี RGB ในรูปแบบฐานสิบหก (ฐานสิบหก) โดยที่ค่าของแต่ละองค์ประกอบอยู่ในช่วง 00… FF ชุดค่าผสม 000000 สอดคล้องกับสีดำ FFFFFF - เป็นสีขาว

วิธีแปลงภาพ RGB เป็นข้อความ
วิธีแปลงภาพ RGB เป็นข้อความ

ในการเริ่มต้น ให้เปิดเนมสเปซการวาด:

ใช้ 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);

แนะนำ: