关于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。
关于c#GDI+绘图填充颜色的常见问题分析(颜色压缩问题)相关推荐
- MFC GDI绘图基础
一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Wind ...
- C# GDI+ 绘图
1 坐标系统 (1) 坐标原点:在窗体或控件的左上角,坐标为(0,0) (2) 正方向:X轴正方向为水平向右,Y轴正方向为竖直向下 (3) 单位:在设置时,一般以像素为单位,像素(Pixel)是由图像 ...
- GDI+绘图基础,绘制表格
GDI+绘图基础 编写图形程序时需要使用GDI(图形设备接口Graphics Device Interface),从程序设计的角度看,GDI包括两个部分:GDI对象和GDI函数. GDI对象定义了GD ...
- Windows高级工程师:GDI+绘图;基础入门大全
Windows GDI绘图基础知识 一.Windows可以画直线.椭圆线(椭圆圆周上的曲线)和贝塞尔曲线. 7 个画线函式是: (1)画直线 LineTo BOOL LineTo(HDC hdc ...
- C# Winform GDI+ 绘图
目录 一.概述 二.绘图 1.画直线 2.画矩形 3.画圆.圆弧 4.画扇形 5.画多边形 6.绘制字符串 7.填充图形 结束 一.概述 Graphics类是GDI+技术的一个基本类.GDI+(Gra ...
- 使用bitblt提高GDI+绘图的效率(转)
最近在做使用GDI+绘制K线界面发现传统的GDI+绘制方式效率比较低,根本无法满足K线界面及时刷新的速度要求. 所以做了个GDI+绘制图形界面的试验,改试验主要在一个600×600的区域内每隔10MS ...
- MFC中的GDI绘图
MFC中的GDI绘图 目录(?)[+] 什么是GDI 什么是DC MFC中与GDI有关的类 获取设备环境 设置坐标映射 创建绘图工具并选入DC 调用DC绘图函数绘图 三坐标映射实例 一.关于GDI的基 ...
- 使用OctreeQuantizer提高gdi+绘图质量
.net中gdi+绘制的图形质量很少,原因是gdi+使用的是256色的. 为了提高绘制图片的质量,可以使用是"Octree" 算法."Octree" 算法允许我 ...
- win32Day05:GDI绘图
目录 0x00画一个像素点: 0x01画线: 0x03画图形:圆形矩形等 0x04在客户区绘制文字: 0x05三级缓存防闪烁 GDI:Graphical Device Interface 图形设备接口 ...
最新文章
- 【C++】C++0x :: Introduction to some amazing features
- 折纸机器人的步骤图解_折纸图解老虎
- Lesson 4.5 梯度下降优化基础:数据归一化与学习率调度
- Fragment的布局中自定义Layout的onSizeChanged添加组件失败的问题
- ASP.NET Core Web 项目文件介绍
- PHP商城数据库安全事务处理方法
- C#笔记11多播委托、事件、设计模式(观察者模式)
- 力扣-543. 二叉树的直径
- asp.net网上零食销售商城系统
- (c++课程设计)简单车辆管理系统(有五种类型的车辆)代码+报告
- 开源遥感软件(未完待续)
- PHP 控制器怎么调接口,mvc控制器的访问与参数解析和API接口获取数据
- 智慧物流园区供应链管理系统解决方案:数智化供应链赋能物流运输行业供应链新模式
- python爬取淘宝数据魔方_淘宝数据魔方看人群情况
- php腾讯云短信接口调用
- 新浪微博开放平台使用
- SVN_处理文件误删恢复
- vue图片时间轴滑动_Vue之时间轴组件
- 自学前端第一天:认识前端工程与网页
- 干细胞技术是不是骗局