System.Drawing DrawLines with Variables

时间:2016-06-08 04:21:20

标签: c# asp.net system.drawing

在System.Drawing中有一个名为DrawLines的命令。

 https://msdn.microsoft.com/en-us/library/83k7w0zx(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

我需要在"单一格式"中将数组X和Y绘制为PointF。但是有一个" F"在每个X和Y点的末尾。

protected void Page_Load(object sender, EventArgs e)
{
double[] X = new double[]{10,15,20,25,30};
double[] Y = new double[]{100,150,200,250,300};
using (Bitmap xPanel = new Bitmap(500, 500))
{
    using (Graphics objGraphicPanel = Graphics.FromImage(xPanel))
    {
            for (int nn = 2; nn <= 5; nn++)
            {
                float x1 = Convert.ToSingle(X[nn - 1]);
                float y1 = Convert.ToSingle(Y[nn - 1]);
                float x2 = Convert.ToSingle(X[nn]);
                float y2 = Convert.ToSingle(Y[nn]);
                PointF[] ptf =
                {
                    new PointF(x1, y1),
                    new PointF(x2, y2)
                };
                objGraphicPanel.DrawLines(colorPen, ptf);
                xPanel.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        }
        string Imgbase64 = Convert.ToBase64String(ms.ToArray());
        MyImage.Src = "data:image/png;base64," + Imgbase64;
        objGraphicPanel.Dispose();
    }
    xPanel.Dispose();

这不起作用,因为它必须采用以下格式:

                PointF[] ptf =
                {
                    new PointF(10.56F, 25.78654F),
                    new PointF(500.123456F, 234.567F)
                };

PointF需要&#34;浮动单一&#34;格式,但我也需要&#34; F&#34;在每个数组的末尾指向PointF和DrawLines。

我如何得到&#34; F&#34;之后还是等价的代码?

这只是我的阵列更大的一个例子。

1 个答案:

答案 0 :(得分:0)

地方

PointF[] ptf =
{
    new PointF(x1, y1),
    new PointF(x2, y2)
};

不是问题。 PointF只接受float参数。当您在数字的末尾加上'F'时,您只需告诉编制者您的号码是浮点数(不是双倍)。在您的代码值中,x1,x2,y1,y2已经浮动,因为您将它们定义为

float x1 = ...
float y1 = ...

问题是,你将数组从2迭代到5.在C#中,数组中的数字是从0到N-1(N是数组的长度)。所以你应该写

for (int nn = 1; nn < 5; nn++)

或者,这是更好的

for (int nn = 1; nn < X.Length; nn++)

此外,您还可以在每次迭代时保存图像。我想

xPanel.Save(ms, System.Drawing.Imaging.ImageFormat.Png);

应该在周期之外。

当你写

using (...)
{
    ...
}

您不需要在括号(和)内部处理您创建的项目。在使用操作符的末尾自动调用dispose。 所以行

objGraphicPanel.Dispose();

xPanel.Dispose();

是多余的。

此外,没有必要创建用于绘制单行的数组ptf。您可以使用DrawLine方法:

objGraphicPanel.DrawLine(colorPen, x1, y1, x2, y2);

所以,下面的代码应该可以正常工作

protected void Page_Load(object sender, EventArgs e)
{
double[] X = new double[]{10,15,20,25,30};
double[] Y = new double[]{100,150,200,250,300};
using (Bitmap xPanel = new Bitmap(500, 500))
{
    using (Graphics objGraphicPanel = Graphics.FromImage(xPanel))
    {
        for (int nn = 1; nn < X.Length; nn++)
        {
            float x1 = Convert.ToSingle(X[nn - 1]);
            float y1 = Convert.ToSingle(Y[nn - 1]);
            float x2 = Convert.ToSingle(X[nn]);
            float y2 = Convert.ToSingle(Y[nn]);
            objGraphicPanel.DrawLine(colorPen, x1, y1, x2, y2);
        }
    }
    xPanel.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
}