GDI+填充颜色示例代码
private void button1_Click(object sender, EventArgs e)
{
//生成游程编码值存储到txt文件中
string strtemp = "";
if (!File.Exists("c:\\data\\youchengraster.txt"))
{
FileStream fs1 = new FileStream("c:\\data\\youchengraster.txt", FileMode.Create, FileAccess.Write);//创建写入文件
StreamWriter sw = new StreamWriter(fs1);
for (int inti = 0; inti < 256; inti++)
{
if (inti < 128)
{
strtemp = "(R,128)|(W,128)";
sw.WriteLine(strtemp);
}
else
{
strtemp = "(Y,128)|(B,128)";
sw.WriteLine(strtemp);
}
}
sw.Close();
fs1.Close();
}
else
{
FileStream fs = new FileStream("c:\\data\\youchengraster.txt", FileMode.Open, FileAccess.Write);
StreamWriter sr = new StreamWriter(fs);
for (int inti = 0; inti < 256; inti++)
{
if (inti < 128)
{
strtemp = "(R,128)|(W,128)";
sr.WriteLine(strtemp);
}
else
{
strtemp = "(Y,128)|(B,128)";
sr.WriteLine(strtemp);
}
}
sr.Close();
fs.Close();
}
}
private void button2_Click(object sender, EventArgs e)
{
Bitmap image = new Bitmap(256, 256);//初始化大小
//读取txt文件并绘制图片
string filePath = "c:\\data\\youchengraster.txt";
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string str = sr.ReadLine();//开始读入值
int i = 0;
while (str != null)
{
string[] strtemp1 = str.Split('|');
int m = 0;
for (int inti = 0; inti < strtemp1.Length; inti++)
{
string str2 = strtemp1[inti].Substring(3, strtemp1[inti].Length - 4);
for (int n = 0; n < Convert.ToInt32(str2); n++)
{
string str1 = strtemp1[inti].Substring(1, 1);
switch (str1)
{
case "R":
image.SetPixel(m, i, Color.Red);
break;
case "W":
image.SetPixel(m, i, Color.White);
break;
case "B":
image.SetPixel(m, i, Color.Black);
break;
case "Y":
image.SetPixel(m, i, Color.Yellow);
break;
default:
break;
}
m = m + 1;
}
}
str = sr.ReadLine();
i = i + 1;
}
Graphics g = Graphics.FromImage(image);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置图片质量
g.DrawImage(image, 0, 0, 256, 256);//设置位置
/*Rectangle recl1 = new Rectangle(120, 100, 20, 40); */ RectangleF[] rects = { new RectangleF(120F, 100F, 20F, 40F) };
g.FillRectangles(Brushes.Blue, rects);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置图片质量
g.DrawImage(image, 0, 0, 256, 256);//设置位置
image.Save("c:\\data\\" + "youchengraster.jpg");//自己创建一个文件夹,放入生成的图片(根目录下)
}
在进行运用图片GDI+填充颜色时,若保存时使用JPG格式保存,会出现如下情况:
若使用PNG格式进行保存,代码如下:
private void button2_Click(object sender, EventArgs e)
{
Bitmap image = new Bitmap(256, 256);//初始化大小
//读取txt文件并绘制图片
string filePath = "c:\\data\\youchengraster.txt";
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string str = sr.ReadLine();//开始读入值
int i = 0;
while (str != null)
{
string[] strtemp1 = str.Split('|');
int m = 0;
for (int inti = 0; inti < strtemp1.Length; inti++)
{
string str2 = strtemp1[inti].Substring(3, strtemp1[inti].Length - 4);
for (int n = 0; n < Convert.ToInt32(str2); n++)
{
string str1 = strtemp1[inti].Substring(1, 1);
switch (str1)
{
case "R":
image.SetPixel(m, i, Color.Red);
break;
case "W":
image.SetPixel(m, i, Color.White);
break;
case "B":
image.SetPixel(m, i, Color.Black);
break;
case "Y":
image.SetPixel(m, i, Color.Yellow);
break;
default:
break;
}
m = m + 1;
}
}
str = sr.ReadLine();
i = i + 1;
}
Graphics g = Graphics.FromImage(image);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置图片质量
g.DrawImage(image, 0, 0, 256, 256);//设置位置
/*Rectangle recl1 = new Rectangle(120, 100, 20, 40); */ RectangleF[] rects = { new RectangleF(120F, 100F, 20F, 40F) };
g.FillRectangles(Brushes.Blue, rects);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;//设置图片质量
g.DrawImage(image, 0, 0, 256, 256);//设置位置
image.Save("c:\\data\\" + "youchengraster.PNG");//自己创建一个文件夹,放入生成的图片(根目录下)
}
生成结果如下:
然后进行像素点读取 ,并导入至txt中
private void button2_Click(object sender, EventArgs e)
{
Bitmap curBitmap;
string path;
Color curcolor;
int redsum=0;
int blacksum = 0;
int wsum = 0;
int sssl = 0;
//textBox1.Text = "D:\\data\\youchengraster.jpg";
curBitmap = (Bitmap)Image.FromFile("D:\\data\\youchengraster.png");//读取图片路径
//var argbColor = Color.FromArgb(255, 255, 0, 0);
int sss = curBitmap.Width * curBitmap.Height;
string[] R = new string[sss];
string[] G = new string[sss];
string[] B = new string[sss];
int m = 0;
for (int i = 0; i < curBitmap.Width; i++)
{
for (int j = 0; j < curBitmap.Height; j++)
{
curcolor = curBitmap.GetPixel(i,j);
R[m] = curcolor.R.ToString();
G[m] = curcolor.G.ToString();
B[m] = curcolor.B.ToString();
m++;
}
}
for(int i = 0; i < sss; i++)
{
string colors = $"{R[i]}{G[i]}{ B[i]}";
//MessageBox.Show(colors);
switch (colors)
{
case "25400" :
redsum = redsum + 1;/* MessageBox.Show(redsum.ToString());*/
break;
case "25500":
redsum = redsum + 1;/* MessageBox.Show(redsum.ToString());*/
break;
case "25300":
redsum = redsum + 1;/* MessageBox.Show(redsum.ToString());*/
break;
case "25200":
redsum = redsum + 1;/* MessageBox.Show(redsum.ToString());*/
break;
case "000":
blacksum++;
break;
case "2552550":
sssl++;
break;
case "255255255":
wsum++;
break;
}
}
string filePath = "d:\\data\\youchengraster.txt";
FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
string str = sr.ReadLine();//开始读入值
FileStream ssss = new FileStream("D:\\data\\xxxxx.txt", FileMode.Create);
StreamWriter sdsd = new StreamWriter(ssss);
sdsd.WriteLine("ID,count,value");
sdsd.WriteLine($"1, {redsum}, 红色");
sdsd.WriteLine($"2, {wsum}, 白色");
sdsd.WriteLine($"3, {sssl}, 黄色");
sdsd.WriteLine($"4, {blacksum}, 黑色");
sdsd.Close();
ssss.Close();
}
当我们进行查看txt文件时,会发现在jpg格式的图片读取会出现问题,是因为jpg对颜色进行压缩,从而导致rgb值发生改变,而png则会完美生成文件。
jpg读取:
png读取:
从而发现读取出现差别。
所以在c#生成颜色填充文件时尽量选择生成PNG,以保证颜色准确性。
注:PNG可为32位色深,分为A(透明度),RBG。