我在使用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;
}
任何想法或见解都将受到赞赏。谢谢!
答案 0 :(得分:1)
两个例程之间的一个区别是
行g.DrawImage(bmp, Res.Width, Res.Height);
之后绘制圆圈。因此,在完全兼容的世界中,Mono框架应该像.NET一样,即绘制位图,其中所有新内容超过自身。
但完全兼容不仅难。考虑到GDI,.NET等悠久历史中的所有奇怪现象,它实际上是不可能的......
Mono似乎使用了原始版本的位图而没有新绘制的圆圈,并通过自己绘制它来删除它们。
所以删除不合情理的一行,一切都应该好......