【问题标题】:How do I draw Pixbuf's onto a surface with Cairo-Sharp?如何使用 Cairo-Sharp 将 Pixbuf 绘制到表面上?
【发布时间】:2014-08-10 21:37:36
【问题描述】:

我正在将我现有的项目之一移植到 GTK3+(GTK-Sharp3 等,因为它是一个 C# 项目)。对于绝大多数情况,这是一个简单的过渡,不需要太多改变,而是我做“区域截图”类型系统的方式(其中用户确定他们希望保存为的全屏图像区域裁剪的版本)似乎已被新库弃用(或者至少我看起来不够努力)。

有问题的代码是 '[Pixmap].DrawPixBuf' 方法,您可以在其中将 pixbuf 绘制到 Pixmap 中,其中包含许多描述要从中获取的源“矩形”和“目标”矩形的参数将源矩形的内容放在里面。

我原来使用的代码如下:

pmBackBuffer.DrawPixbuf(drawingAreaRegion.Style.BaseGC(StateType.Normal),
pbHazy, 0, 0, 0, 0, platformSpecific.getScreenWidth(), platformSpecific.getScreenHeight(), RgbDither.Normal, 0, 0);

它需要 pixmap 'pmBackBuffer',使用 BaseGC(这个概念现在似乎也被弃用)绘制到它,从源上的坐标 0、0 开始,并将它们放置在当前屏幕的大小上目的地。

我收集到可能 Cairo 是此类系统的替代品,并且一些在线文档建议 Pixmap 对象已被 Cairo 表面替换,但我不知道如何获得类似的行为,我可以绘制一个Pixbuf 将这些参数放到表面上。

我也找不到任何人询问如何将 Pixmap 转换为 Surface。我找到了相反的方式,但不是我想要的方式。

那么问题是,有没有一种方法与我上面对新开罗表面的方法类似?

非常感谢任何帮助。

【问题讨论】:

    标签: c# graphics gtk cairo pixbuf


    【解决方案1】:

    原来这样做的方法是先创建一个Context,然后使用

    Gdk.CairoHelper
    

    方法

    Gdk.CairoHelper.SetSourcePixbuf(Context, Pixbuf, 0, 0)
    

    将 Pixbuf 转移到现有的 ImageSurface 中。一个更详细的例子如下:

    private void Example(Pixbuf pb)
    {
        ImageSurface imgSurface = new ImageSurface(Format.RGB24, pb.Width, pb.Height);
    
        using (Cairo.Context cr = new Cairo.Context(imgSurface)) {
            Gdk.CairoHelper.SetSourcePixbuf (cr, pb, 0, 0);
            cr.Paint ();
            cr.Dispose ();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多