Unfortunately, the reference to DocD I didnβt open for some reason, but hereβs the working code for converting BMP into a color matrix like this:
public Color[][] GetBitMapColorMatrix(string bitmapFilePath) { bitmapFilePath = @"C:\Filename.bmp"; Bitmap b1 = new Bitmap(bitmapFilePath); int hight = b1.Height; int width = b1.Width; Color[][] colorMatrix = new Color[width][]; for (int i = 0; i < width; i++) { colorMatrix[i] = new Color[hight]; for (int j = 0; j < hight; j++) { colorMatrix[i][j] = b1.GetPixel(i, j); } } return colorMatrix; }
Accordingly, you will have a picture as a two-dimensional array of the Color type, which has a Color.ToArgb() method, which returns a value of type int and the 'ToString ()' method, which returns a string representation.
So with the help of these methods it is quite possible to present a picture in the form of a text file, writing in it the string or integer values ββof the matrix.
Here is an example of a modified method for saving to files via ToString() and via ToArgb() respectively:
private void button1_Click(object sender, EventArgs e) { //ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ (Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΎΡΠΈ Π₯ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ) string FileLine1 = string.Empty; //ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΡΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ, Π² ΠΊΠΎΡΠΎΡΡΠΉ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΎΡΡΡΠΎΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ ΠΌΠ°ΡΡΠΈΡΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅ List<string> file1 = new List<string>(); //ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊΠΈ ΠΌΠ°ΡΡΠΈΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ Π±ΡΠ΄Π΅ΠΌ ΠΏΠΈΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ²Π΅ΡΠΎΠ² Π² ΡΠΎΡΠΌΠ°ΡΠ΅ ARGB string FileLine2 = string.Empty; //Π‘ΠΏΠΈΡΠΎΠΊ ΡΡΡΠΎΠΊ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠΎΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° List<string> file2 = new List<string>(); if (openFileDialog1.ShowDialog() == DialogResult.OK) { //ΠΡΠ»ΠΈ ΠΌΡ ΡΠ΅ΡΠ΅Π· Π΄ΠΈΠ°Π»ΠΎΠ³ Π²ΡΠ±ΡΠ°Π»ΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΡ, ΡΠΎ Π³ΡΡΠ·ΠΈΠΌ Π΅Π΅ Π² Π±ΠΈΡΠΌΠ°ΠΏ. Bitmap b1 = new Bitmap(openFileDialog1.FileName); //ΠΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ Π²ΡΡΠΎΡΡ ΠΈ ΡΠΈΡΠΈΠ½Ρ ΠΌΠ°ΡΡΠΈΡΡ (ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ)... //...ΠΈ ΡΡΡ ΠΆΠ΅ Π·Π°Π΄Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΡΠΈΡ
ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
Π²Π·ΡΠ² ΠΈΡ
ΠΈΠ· Π²ΡΡΠΎΡΡ ΠΈ ΡΠΈΡΠΈΠ½Ρ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ Π² ΠΏΠΈΠΊΡΠ΅Π»ΡΡ
int height = b1.Height; //ΠΡΠΎ Π²ΡΡΠΎΡΠ° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ, ΠΈ Π½Π°ΡΠ° ΠΌΠ°ΡΡΠΈΡΠ° ΠΏΠΎ Π²Π΅ΡΡΠΈΠΊΠ°Π»ΠΈ Π±ΡΠ΄Π΅Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠ³ΠΎ ΠΆΠ΅ ΡΠΈΡΠ»Π° ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². int width = b1.Width; //ΠΡΠΎ ΡΠΈΡΠΈΠ½Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ, Ρ.Π΅. ΡΠΈΡΠ»ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΡΡΠΈΡΡ ΠΏΠΎ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΠΈ //Π’ΡΡ ΠΌΡ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΠΌ ΡΠ°ΠΌΡ ΠΌΠ°ΡΡΠΈΡΡ Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΡΠΌΠ΅ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°ΡΡΠΈΠ²Π°, Color[,] colorMatrix = new Color[width,height]; //ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠΈΠΊΠ», Π³Π΄Π΅ ΠΈΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ Π±ΡΠ΄Π΅Ρ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ i, ΡΠ°Π²Π½Π°Ρ ΠΏΡΠΈ Π½Π°ΡΠ°Π»Π΅ ΡΠΈΠΊΠ»Π° Π½ΡΠ»Ρ. //Π¦ΠΈΠΊΠ» Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΎΡ 0 ΠΈ Π΄ΠΎ ΡΠ΅Ρ
ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° y ΠΌΠ΅Π½ΡΡΠ΅ height (Π²ΡΡΠΎΡΡ ΠΌΠ°ΡΡΠΈΡΡ ΠΈ ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ) //ΠΠ° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ y Π½Π° Π΅Π΄ΠΈΠ½ΠΈΡΡ. for (int y = 0; y < height; y++) { //Π Π½Π°ΡΠ°Π»Π΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΡ ΠΎΠ±Π½ΡΠ»ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π΄Π»Ρ ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊ Π΄Π»Ρ ΡΠ°ΠΉΠ»ΠΎΠ² FileLine1 = string.Empty; FileLine2 = string.Empty; //Π ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΊΠ°Π½ΠΈΡΡΠ΅ΠΌ Π³ΠΎΡΠΈΠ·ΠΎΠ½ΡΠ°Π»ΡΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ ΠΌΠ°ΡΡΠΈΡΡ: for (int x = 0; x < width; x++) { //Π ΠΌΠ°ΡΡΠΈΡΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΡΠ²Π΅Ρ ΡΠΎΡΠΊΠΈ Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ x,y ΠΈΠ· ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ b1. colorMatrix[x,y] = b1.GetPixel(x, y); //Π ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΠΌ ΡΠ²Π΅Ρ ΡΠΎΡΠΊΠΈ (x,y) Π²: //1. Π’Π΅ΠΊΡΡΠΎΠ²ΠΎΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΠ΅: FileLine1 += colorMatrix[x,y].ToString() + " "; //2. ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅ΡΠ° Π² ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠΌ ΡΠΎΡΠΌΠ°ΡΠ΅: FileLine2 += colorMatrix[x,y].ToArgb().ToString() + " "; //Π’ΡΡ Π² ΠΎΠ±ΠΎΠΈΡ
ΡΠ»ΡΡΠ°ΡΡ
Π² ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΌ ΠΈΡΠΎΠ³Π΅ ΡΡΡΠΎΠΊΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΡΡΡΡ ΠΊ ΡΠΈΠΏΡ string Π΄Π»Ρ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΈΡ
ΡΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ } //Π ΡΠ΅ΠΏΠ΅ΡΡ Π² ΡΠΏΠΈΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΈΠ· ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ
ΡΡΡΠΎΠΊ: //Π‘ΡΡΠΎΠΊΠ° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΠΎΠΌ Π²ΠΈΠ΄Π΅: file1.Add(FileLine1); //Π‘ΡΡΠΎΠΊΠ° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠΈ Π² Π²ΠΈΠ΄Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΡΠ²Π΅ΡΠΎΠ² ΠΏΠΈΠΊΡΠ΅Π»Π΅ΠΉ file2.Add(FileLine2); } //ΠΠ°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ Π² ΡΠ΅ΠΊΡΡΠΎΠ²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ: File.WriteAllLines("D:\\pic1.txt", file1); File.WriteAllLines("D:\\pic2.txt", file2); } }
Personally, the variant with preserving integer values ββseemed more convenient to me. Therefore, the reverse process was written for him. I wrote quite quickly and "in the forehead," I am sure, it was possible to do more optimally:
private void button2_Click(object sender, EventArgs e) { List<string> file = new List<string>(); if (openFileDialog1.ShowDialog() == DialogResult.OK) { file = File.ReadAllLines(openFileDialog1.FileName).ToList(); if (file.Count() < 1) return; //Π€Π°ΠΉΠ» ΠΏΡΡΡΠΎΠΉ! var width = file[0].Split(' ').Count() - 1; //Π ΠΊΠΎΠ½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΡΠΎΠ±Π΅Π»! var heigh = file.Count; Bitmap b2 = new Bitmap(width, heigh); string[] s; for (var y = 0; y < heigh; y++) { s = file[y].TrimEnd(' ').Split(' '); for (var x = 0; x < width; x++) { var i = int.Parse(s[x]); Color pixel = new Color(); pixel = Color.FromArgb(i); b2.SetPixel(x, y, pixel); } } } }
Bitmap.LockBits. - VladD