将椭圆绘制到位图。在.NET中工作,在Mono中不起作用

时间:2018-03-30 14:58:18

标签: c# bitmap mono system.drawing

我在使用Raspbian 9(stretch)上的mono 4.6.2上运行的.NET 4.0 C#WinForms应用程序中将椭圆绘制到位图时遇到了一些问题。 所讨论的方法在黑色屏幕上生成具有指定直径的5个白色圆圈的位图。屏幕每个角落一个圆圈,一个在中心。位图意味着包含整个屏幕,所以我通过Screen.Bounds()获得位图的大小作为矩形,这反过来给我Res.Width和Res.Height。

此代码在.NET中的Windows中运行(这是它最初编写和测试的),但是在Raspbian上通过mono运行exe,只需用白色填充位图。我还发现在Windows中以单声道运行(v5.10.0.160),生成的圆圈最终比在.NET中运行时小。

private Bitmap GenerateCirclesBitmap(int diam)
    {
        Bitmap bmp = GenerateColorBitmap(Color.Black);
        Graphics g = Graphics.FromImage(bmp);
        g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

        Brush whiteBrush = new SolidBrush(Color.White);
        g.FillEllipse(whiteBrush, diam/7, diam/7, diam, diam);    //Top Left Corner
        g.FillEllipse(whiteBrush, diam/7, (Res.Height - diam)-(diam/7), diam, diam); //Bottom Left Corner
        g.FillEllipse(whiteBrush, (Res.Width - diam) - (diam / 7), (Res.Height - diam) - (diam / 7), diam, diam); //Bottom Right Corner
        g.FillEllipse(whiteBrush, (Res.Width - diam) - (diam / 7), diam/7, diam, diam); //Top Right Corner
        g.FillEllipse(whiteBrush, (Res.Width / 2) - (diam / 2), (Res.Height / 2) - (diam / 2), diam, diam); //Center
        g.DrawImage(bmp, Res.Width, Res.Height);
        return bmp;
    }

我想也许这是屏幕尺寸,Res.Width和/或Res.Height的问题,但如果是这种情况,我希望我的方法生成彩条也会有问题。然而,这个代码在单声道版本和.NET版本中按预期工作(8个颜色条,每个屏幕宽度的1/8),这使我认为Res.Width是正常的:

        private Bitmap GenerateBarsBitmap(Color bar1, Color bar2, Color bar3, Color bar4, Color bar5, Color bar6)
    {
        Bitmap bmp = GenerateColorBitmap(Color.Black);
        int barwidth = Res.Width / 8;
        Color[] colors = new Color[8];
        Brush b = new SolidBrush(Color.White);
        Graphics g = Graphics.FromImage(bmp);

        colors[0] = Color.White;
        colors[1] = bar1;
        colors[2] = bar2;
        colors[3] = bar3;
        colors[4] = bar4;
        colors[5] = bar5;
        colors[6] = bar6;
        colors[7] = Color.Black;

        g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;

        for (int colornum = 0; colornum < colors.Length; colornum++)
        {
            b = new SolidBrush(colors[colornum]);
            g.FillRectangle(b, barwidth * colornum, 0, barwidth, Res.Height);
            b.Dispose();
        }

        return bmp;
    }

任何想法或见解都将受到赞赏。谢谢!

1 个答案:

答案 0 :(得分:1)

两个例程之间的一个区别是

g.DrawImage(bmp, Res.Width, Res.Height);

之后绘制圆圈。因此,在完全兼容的世界中,Mono框架应该像.NET一样,即绘制位图,其中所有新内容超过自身

但完全兼容不仅难。考虑到GDI,.NET等悠久历史中的所有奇怪现象,它实际上是不可能的......

Mono似乎使用了原始版本的位图而没有新绘制的圆圈,并通过自己绘制它来删除它们。

所以删除不合情理的一行,一切都应该好......