关于c#GDI+绘图填充颜色的常见问题分析(颜色压缩问题)

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。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值