相同高度用DrawLine画出来的线不一样长?

时间:2023-02-04 19:35:15
//画线语句
 g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);

//画出来的效果?不知道为什么高度不一样呢!?

相同高度用DrawLine画出来的线不一样长?

35 个解决方案

#1


是不是因为取整的问题?

#2


g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40); 
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。 
y1 第一个点的 y 坐标。 
x2 第二个点的 x 坐标。 
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

#3


引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

学习

#4


是不是pen的线帽的问题

#5


x + width / 2 在外边转换成 int看看

如果不行

Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;

看看

#6


顶一下~!

#7


引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。
1

#8


引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

这个应该可以行。。。。。。

#9


果然有牛人

#10


我画的是竖线,y1:10,y2:40我是写死进行测试的,图片也就是通过这个语句画出来的

X1,X2是根据线宽来进行变化的?

问题奇怪的的是,当width变大后,线就一样长了!



引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

#11


顶!

#12


贴上你的代码

#13


//画线语句 
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40); 

就是这一语句呀!

其它的代码就是计算width的的值的
width:是保留二位的小数的!

#14


Graphics g = this.CreateGraphics();

            for (int width = 6; width < 40; width+=4)
            {
                g.DrawLine(new Pen(Color.Black, 2), width , 10, width, 40);
            }

没有出现你的这种现象

#15


我测试了,是长短不齐,细的长. 怀疑边界线处理时与浮点数误处理有关,与线宽有关系.

可以换一个方法,这样不存在边界线的问题

SolidBrush myBrush = new SolidBrush(Color.Blue);
g.FillRectangle(myBrush, new RectangleF( 3, 1, 1, 100));
g.FillRectangle(myBrush, new RectangleF( 6, 1, 2, 100));
g.FillRectangle(myBrush, new RectangleF(11, 1, 3, 100));
g.FillRectangle(myBrush, new RectangleF(20, 1, 2, 100));
g.FillRectangle(myBrush, new RectangleF(25, 1, 5, 100));

#16


15楼的代码 在windowxp + C#2005环境 测试通过

#17


你的代码太少了,没发现你说的问题,你是在测试一个人家写的代码吗?
如果是,条形码本来都是有长有短的,多出来的地方可能是其他地方画的

你都定死了 10-40

            int x = 0;
            float width = 10.99F;
            e.Graphics.DrawLine(new Pen(Brushes .Red,width) , x + width / 2, 10, x + width / 2, 40);

            x = 12;
            width = 20.99F;
            e.Graphics.DrawLine(new Pen(Brushes.Red, width), x + width / 2, 10, x + width / 2, 40);

            x = 34;
            width = 30.99F;
            e.Graphics.DrawLine(new Pen(Brushes.Red, width), x + width / 2, 10, x + width / 2, 40);

#18


不错,学习。

#19


有没有什么办法可以修正这个问题
因为是条码,线宽要符合标准,所以肯定有小的数?

引用 15 楼 lzsh0622 的回复:
我测试了,是长短不齐,细的长. 怀疑边界线处理时与浮点数误处理有关,与线宽有关系.

可以换一个方法,这样不存在边界线的问题
C# code
SolidBrush myBrush=new SolidBrush(Color.Blue);
g.FillRectangle(myBrush,new RectangleF(3,1,1,100));
g.FillRectangle(myBrush,new RectangleF(6,1,2,100));
g.FillRectangle(myBrush,new RectangleF(11,1,3,100));
g.FillRectangle(myBrush,new RectangleF(20,1,2,100));
g.FillRectangle(myBrush,new RectangleF(25,1,5,100));

#20


你让长度向其中一个看齐不就好了吗?
计算好第一个的Height后,其他都是用这个.

#21


引用 19 楼 dunao 的回复:
有没有什么办法可以修正这个问题
因为是条码,线宽要符合标准,所以肯定有小的数?

你用 g.FillRectangle 试了吗?

#22


g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40); 

Y值已固定!!!!

#23


把g.DrawLine 换成 g.FillRectangle 一样能画出条码,应该更合理.

#24


g.FillRectangle这个能画出来,但就精度来说,DrawLine比FillRectangle的精度高

#25


UP

#26


g.FillRectangle的精度够用。

条码是用来打印和扫描的,打印机输出的最小单位是1像素,你能计算出0.03像素也没用。

#27


误差造成的。

#28


up26F
的确,企业用的打印机输出最小单位是一像素.FillRectangle精度够用了.

#29


引用 26 楼 lzsh0622 的回复:
g.FillRectangle的精度够用。

条码是用来打印和扫描的,打印机输出的最小单位是1像素,你能计算出0.03像素也没用。

有道理。

#30


现在我是条码打印机,打印最小规格的少一条线,我现在在想办法解决,
有什么办法可以提高精度的?

#31


你发贴的标题是:相同高度用DrawLine画出来的线不一样长?

“现在我是条码打印机,打印最小规格的少一条线,我现在在想办法解决, 
有什么办法可以提高精度的?” 应该是另一个问题吧.

你已经确认是精度不够吗?不会是别的原因?

#32


引用楼主 dunao 的回复:
//画线语句
  g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);

 //画出来的效果?不知道为什么高度不一样呢!?

请注意 g.DrawLine(new Pen(sb.Color, width), ...) 中, Pen 的宽度由 width 指明, 所以只需要变更 width 的值, 即可改变线条的宽度

#33


引用 32 楼 lethwei 的回复:
引用楼主 dunao 的回复:
 //画线语句
   g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);

  //画出来的效果?不知道为什么高度不一样呢!?



 请注意 g.DrawLine(new Pen(sb.Color, width), ...) 中, Pen 的宽度由 width 指明, 所以只需要变更 width 的值, 即可改变线条的宽度

sorry, 看错了, 丢人ing...
不过楼主也有误导嫌疑, 问题问的也忒模糊了

#34


丢线,不是精度问题.

除硬件故障,就是算法问题.

#35



        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics g = e.Graphics;

            for (int i = 0; i < 100; i += 5)
            {
                float width = i / 20.0f;
                if (width > 2.0f) {
                    width = 2.0f;
                }
                g.DrawLine(new Pen(Color.Black, width), (float)i , (float)10, (float)i, (float)80);
            } 
            for (int i = 0; i < 100; i += 5) {
                float width = i / 20.0f;
                if (width > 2.0f) {
                    width = 2.0f;
                }
                g.FillRectangle(new SolidBrush(Color.Black), (float)i, (float)100, width, (float)80);
            } 
        }

试了下, FillRectangle 精度比 DrawLine 精度高点

#1


是不是因为取整的问题?

#2


g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40); 
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。 
y1 第一个点的 y 坐标。 
x2 第二个点的 x 坐标。 
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

#3


引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

学习

#4


是不是pen的线帽的问题

#5


x + width / 2 在外边转换成 int看看

如果不行

Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
            Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;

看看

#6


顶一下~!

#7


引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。
1

#8


引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

这个应该可以行。。。。。。

#9


果然有牛人

#10


我画的是竖线,y1:10,y2:40我是写死进行测试的,图片也就是通过这个语句画出来的

X1,X2是根据线宽来进行变化的?

问题奇怪的的是,当width变大后,线就一样长了!



引用 2 楼 lzsh0622 的回复:
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);
楼主只给出一条线,这个问题与其他线有关。

(1) 核实四个参数排列顺序,纵坐标是否相等。
x1 第一个点的 x 坐标。
y1 第一个点的 y 坐标。
x2 第二个点的 x 坐标。
y2 第二个点的 y 坐标。

(2)参数类型 y1,y2 的值 是否是经过计算得到的,

坐标值,float浮点型,是不准确数值,计算过程中和表示上有误差。
坐标值使用前采用相同的精度。 或最后直接转化成int32类型。这样保证值是相等的。

#11


顶!

#12


贴上你的代码

#13


//画线语句 
g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40); 

就是这一语句呀!

其它的代码就是计算width的的值的
width:是保留二位的小数的!

#14


Graphics g = this.CreateGraphics();

            for (int width = 6; width < 40; width+=4)
            {
                g.DrawLine(new Pen(Color.Black, 2), width , 10, width, 40);
            }

没有出现你的这种现象

#15


我测试了,是长短不齐,细的长. 怀疑边界线处理时与浮点数误处理有关,与线宽有关系.

可以换一个方法,这样不存在边界线的问题

SolidBrush myBrush = new SolidBrush(Color.Blue);
g.FillRectangle(myBrush, new RectangleF( 3, 1, 1, 100));
g.FillRectangle(myBrush, new RectangleF( 6, 1, 2, 100));
g.FillRectangle(myBrush, new RectangleF(11, 1, 3, 100));
g.FillRectangle(myBrush, new RectangleF(20, 1, 2, 100));
g.FillRectangle(myBrush, new RectangleF(25, 1, 5, 100));

#16


15楼的代码 在windowxp + C#2005环境 测试通过

#17


你的代码太少了,没发现你说的问题,你是在测试一个人家写的代码吗?
如果是,条形码本来都是有长有短的,多出来的地方可能是其他地方画的

你都定死了 10-40

            int x = 0;
            float width = 10.99F;
            e.Graphics.DrawLine(new Pen(Brushes .Red,width) , x + width / 2, 10, x + width / 2, 40);

            x = 12;
            width = 20.99F;
            e.Graphics.DrawLine(new Pen(Brushes.Red, width), x + width / 2, 10, x + width / 2, 40);

            x = 34;
            width = 30.99F;
            e.Graphics.DrawLine(new Pen(Brushes.Red, width), x + width / 2, 10, x + width / 2, 40);

#18


不错,学习。

#19


有没有什么办法可以修正这个问题
因为是条码,线宽要符合标准,所以肯定有小的数?

引用 15 楼 lzsh0622 的回复:
我测试了,是长短不齐,细的长. 怀疑边界线处理时与浮点数误处理有关,与线宽有关系.

可以换一个方法,这样不存在边界线的问题
C# code
SolidBrush myBrush=new SolidBrush(Color.Blue);
g.FillRectangle(myBrush,new RectangleF(3,1,1,100));
g.FillRectangle(myBrush,new RectangleF(6,1,2,100));
g.FillRectangle(myBrush,new RectangleF(11,1,3,100));
g.FillRectangle(myBrush,new RectangleF(20,1,2,100));
g.FillRectangle(myBrush,new RectangleF(25,1,5,100));

#20


你让长度向其中一个看齐不就好了吗?
计算好第一个的Height后,其他都是用这个.

#21


引用 19 楼 dunao 的回复:
有没有什么办法可以修正这个问题
因为是条码,线宽要符合标准,所以肯定有小的数?

你用 g.FillRectangle 试了吗?

#22


g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40); 

Y值已固定!!!!

#23


把g.DrawLine 换成 g.FillRectangle 一样能画出条码,应该更合理.

#24


g.FillRectangle这个能画出来,但就精度来说,DrawLine比FillRectangle的精度高

#25


UP

#26


g.FillRectangle的精度够用。

条码是用来打印和扫描的,打印机输出的最小单位是1像素,你能计算出0.03像素也没用。

#27


误差造成的。

#28


up26F
的确,企业用的打印机输出最小单位是一像素.FillRectangle精度够用了.

#29


引用 26 楼 lzsh0622 的回复:
g.FillRectangle的精度够用。

条码是用来打印和扫描的,打印机输出的最小单位是1像素,你能计算出0.03像素也没用。

有道理。

#30


现在我是条码打印机,打印最小规格的少一条线,我现在在想办法解决,
有什么办法可以提高精度的?

#31


你发贴的标题是:相同高度用DrawLine画出来的线不一样长?

“现在我是条码打印机,打印最小规格的少一条线,我现在在想办法解决, 
有什么办法可以提高精度的?” 应该是另一个问题吧.

你已经确认是精度不够吗?不会是别的原因?

#32


引用楼主 dunao 的回复:
//画线语句
  g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);

 //画出来的效果?不知道为什么高度不一样呢!?

请注意 g.DrawLine(new Pen(sb.Color, width), ...) 中, Pen 的宽度由 width 指明, 所以只需要变更 width 的值, 即可改变线条的宽度

#33


引用 32 楼 lethwei 的回复:
引用楼主 dunao 的回复:
 //画线语句
   g.DrawLine(new Pen(sb.Color, width), x + width / 2, 10, x + width / 2, 40);

  //画出来的效果?不知道为什么高度不一样呢!?



 请注意 g.DrawLine(new Pen(sb.Color, width), ...) 中, Pen 的宽度由 width 指明, 所以只需要变更 width 的值, 即可改变线条的宽度

sorry, 看错了, 丢人ing...
不过楼主也有误导嫌疑, 问题问的也忒模糊了

#34


丢线,不是精度问题.

除硬件故障,就是算法问题.

#35



        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            Graphics g = e.Graphics;

            for (int i = 0; i < 100; i += 5)
            {
                float width = i / 20.0f;
                if (width > 2.0f) {
                    width = 2.0f;
                }
                g.DrawLine(new Pen(Color.Black, width), (float)i , (float)10, (float)i, (float)80);
            } 
            for (int i = 0; i < 100; i += 5) {
                float width = i / 20.0f;
                if (width > 2.0f) {
                    width = 2.0f;
                }
                g.FillRectangle(new SolidBrush(Color.Black), (float)i, (float)100, width, (float)80);
            } 
        }

试了下, FillRectangle 精度比 DrawLine 精度高点