【问题标题】:Can Cairo draw directly onto a Gtk.Pixbuf?Cairo 可以直接在 Gtk.Pixbuf 上绘图吗?
【发布时间】:2011-09-23 02:01:41
【问题描述】:

我在 C# 中有一个很好的工作系统,它在渲染方法中使用 Cairo 命令进行绘制。但是,有时我想绘制像素图,而不是在需要更新屏幕时动态绘制。例如,目前我有:

public override void render(Cairo.Context g) {
  g.Save();
  g.Translate(x, y);
  g.Rotate(_rotation);
  g.Scale(_scaleFactor, _scaleFactor);
  g.Scale(1.0, ((double)_yRadius)/((double)_xRadius));
  g.LineWidth = border;
  g.Arc(x1, y2, _xRadius, 0.0, 2.0 * Math.PI); 
  g.ClosePath();
}

但如果我愿意,我想将 Cairo 命令渲染到 Gtk.Pixbuf。比如:

 g = GetContextFromPixbuf(pixbuf);
 render(g);

这可能吗?如果我不必将上下文转回 pixbuf,那就太好了,但是 cairo 绘图将直接转到 pixbuf。对此的任何提示将不胜感激!

【问题讨论】:

    标签: c# gtk# cairo pixbuf


    【解决方案1】:

    答案实际上很简单:当您渲染对象时,将它们渲染到从保存的表面创建的上下文中。然后在渲染窗口时,根据相同的已保存表面插入上下文。

    创建一个表面:

      surface = new Cairo.ImageSurface(Cairo.Format.Argb32, width, height);
    

    将形状渲染到表面:

    using (Cairo.Context g = new Cairo.Context(surface)) {
      shape.render(g); // Cairo drawing commands
    }
    

    渲染窗口:

      g.Save();
      g.SetSourceSurface(surface, 0, 0);
      g.Paint();
      g.Restore();
          ... // other Cairo drawing commands
    

    就是这样!

    【讨论】:

    • 这里涉及的 Pixbuf 在哪里?还是这个问题只是提供了一种避免一起使用 Pixbuf 的方法?
    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多