代码之家  ›  专栏  ›  技术社区  ›  K_Trenholm

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

  •  1
  • K_Trenholm  · 技术社区  · 6 年前

    在中为位图绘制椭圆时,我遇到了一些问题。NET 4.0 C#WinForms应用程序运行在Raspbian 9(stretch)上的mono 4.6.2上。 该方法在黑屏上生成5个指定直径的白色圆圈的位图。屏幕每个角落一个圆圈,中间一个圆圈。位图旨在包含整个屏幕,因此我通过屏幕将位图的大小获取为矩形。Bounds(),这又给了我Res.Width和Res.Height。

    此代码在中的Windows中正常工作。NET(这是它最初编写和测试的内容),但在Raspbian上通过mono运行exe,只需用白色填充位图。我还发现,在mono for Windows(v5.10.0.160)中运行时,生成的圆圈最终会比运行时小。净额。

    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;
        }
    

    我想这可能是屏幕尺寸、分辨率宽度和/或分辨率高度的问题,但如果是这样的话,我希望我生成色条的方法也会有问题。然而,该代码在mono和in的两个版本上都能正常工作(8个色条,每个色条占总屏幕宽度的1/8)。NET,这让我觉得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 回复  |  直到 6 年前
        1
  •  1
  •   TaW    6 年前

    你的两个套路之间的一个区别是

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

    它来了 之后 你画圆圈。因此,在一个完全兼容的世界中,Mono框架也应该这样做。NET所做的,即使用所有新内容绘制位图 在自己身上

    但完全兼容不仅困难。考虑到GDI漫长历史中的所有奇怪之处。事实上,这是不可能的。。

    Mono似乎使用了位图的原始版本,没有新绘制的圆,通过在其上绘制,它会删除这些圆。

    所以去掉不必要的线,一切都会好起来的。。