【问题标题】:GDI+ Nested Graphics objectsGDI+ 嵌套图形对象
【发布时间】:2014-08-01 14:16:27
【问题描述】:

使用System.Drawing.Graphics,我如何才能拥有“嵌套图形对象”。 主要目的是有几个裁剪区域。

这就是我想做的事情:

整个屏幕都是一个Graphics对象

红色区域是里面的另一个Graphic,被剪掉了

绿色区域是另一个,被剪掉了

内部图形对象可以是任何东西,不仅是DrawString

代码应如下所示:

using (var bmp = new System.Drawing.Bitmap(200, 200))
using (var mainG = System.Drawing.Graphics.FromImage(bmp))
using (var redG = ???)
using (var greenG = ???)
{
    redG.SetClip(new RectangleF(...));
    greenG.SetClip(new RectangleF(...));

    // fill redG and greenG
}

注意:结果应该转到元文件并且是矢量图形,因此创建位图并将它们放置在 mainG 周围不是一种选择。

【问题讨论】:

  • 不会使用mainG.SetClip(boundsOfRedArea) 为您工作吗?然后,您可以在 mainG 上绘制,就好像它是一个单独的 redG 图形对象一样。
  • 那么如何裁剪绿色区域?
  • 画完红色后,你只需SetClip到绿色区域。
  • 这个问题很笼统。可能不止两个区域,区域内也可能有区域
  • 除了你不能有多个剪辑

标签: c# graphics gdi+


【解决方案1】:

假设两个向量上下文在被绘制时可以分开,您可以使用 System.Drawing.Imaging.Metafile 来捕获向量操作,然后将它们组合到更大的上下文中。像这样:

using (Graphics gRef = this.CreateGraphics())  
{  
    IntPtr hdc = gRef.GetHdc();  
    using (System.Drawing.Imaging.Metafile mf = 
           new System.Drawing.Imaging.Metafile(hdc, 
                System.Drawing.Imaging.EmfType.EmfPlusDual))  
        {  
          gRef.ReleaseHdc();  

          using (Graphics redG = Graphics.FromImage(mf))  
          {  
            redG.SetClip(new RectangleF(...));

            // .. draw on redG 
          }  
          // repeat for greenG

          // .. save and or combine as desired

        }  
    } 

}

【讨论】:

    【解决方案2】:

    另一种方法是研究增强型元文件格式 (http://msdn.microsoft.com/en-us/library/cc230724.aspx) 并尝试手动复制剪贴蒙版。

    【讨论】:

    • 没错!在研究了这种格式后,我想到了这个问题,我想知道如何重现 GDI+ 中可用的剪辑:)
    • 好吧,我想你现在知道答案了:)
    • 很遗憾我找不到 GDI+ 等价物
    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 2016-07-05
    • 2020-07-04
    • 1970-01-01
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多