c# 中GDI+ 绘图时坐标Point 与PointF讨论

assassion1981 2017-01-12 11:22:12
最近做一个项目,需要实时绘制曲线,X轴为时间轴,在时间轴上显示实时时间;由于曲线是实时更新的,会由右向左移动;但是程序运行后,发现曲线有抖动,X轴上显示的时间值也有抖动(只是前后抖动);
进过检查发现是每个坐标(Location)的问题,我用PointF作为坐标点,但问题来了:
用graphics.drawLine或graphics.drawstring画图时,对PointF会进行取整,例如 PointF(10.3f,20.0f),画到bitmap上就变成了Point(10,20);
这个我做过一些测试:例如画两条竖线 -
line01 (Point(0,0),Point(0,50))
line02(PointF(0.7f,50.0f),Point(0.7f,100.0f))
理论上这两条竖线在X坐标轴上只差0.7个像素(我设置的graphics的画图单位为Pixel)。但实际画到bitmap上时,这两条竖线在X方向上差了1个像素。
又例如:
line01 (Point(0,0),Point(0,50))
line02(PointF(0.2f,50.0f),Point(0.2f,100.0f))
画到bitmap上时,这两条竖线在X方向没有偏差。0.2f四舍五入变成了0.0f;

我想这就是抖动的原因:例如一个时间坐标“a”显示在X轴上,其X坐标会随时而改变,对其X坐标的算法是: 当前获得的时间减去a的时间值,再转换成毫秒值b,再将b转换成X轴的坐标值;最后的结果是一个float型数值,可是GDI+在画图时,对这个数值进行了取整操作。如下图:当程序运行后,这些时间值会向左移动,但是移动时会前后抖动。


请问有没有办法可以使GDI+ 绘图时保证能完全按照PointF指定的坐标点绘制,而不进行取整运算。
或者是其他的办法,来保证画图效果? DirectX2D可以做到吗?不太懂DirectX2D...
...全文
1129 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
东博东客 2020-01-09
  • 打赏
  • 举报
回复
我也在做这个 能发一下你的这一部分项目源码吗?万分感激!!!
assassion1981 2017-01-13
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
你拿放大镜看你的屏幕,放大以后可以看到一点一点(红绿蓝)。 也就是说你的LED显示器的显示是离散的,不连续的。 它显示像素x=1或x=2没有问题,却没有办法直接显示x=1.5。 x=1.5之类的显示只能同过欺骗人眼来达到,比如采用‘抖动’,‘模糊’等等方式。 DirectX2D和GDI一样,并不能克服显示器的物理局限。
你说的‘抖动’,‘模糊’等等方式,需要修改graphics的什么属性吗?
Forty2 2017-01-12
  • 打赏
  • 举报
回复
你拿放大镜看你的屏幕,放大以后可以看到一点一点(红绿蓝)。 也就是说你的LED显示器的显示是离散的,不连续的。 它显示像素x=1或x=2没有问题,却没有办法直接显示x=1.5。 x=1.5之类的显示只能同过欺骗人眼来达到,比如采用‘抖动’,‘模糊’等等方式。 DirectX2D和GDI一样,并不能克服显示器的物理局限。
  • 打赏
  • 举报
回复
你的意思是使用pointF后还是会四舍五入小数点后面的数值? 如果发生这个情况很大可能是你的graphics图像质量设置的不够高,可以改为HighQuality:
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧