如何使用Cairo-Sharp将Pixbuf绘制到表面上?

时间:2014-08-03 15:15:04

标签: c# graphics gtk cairo pixbuf

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

有问题的代码是'[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。我找到了另一种方式,但不是我想要的方式。

所以问题是,是否有一种方法与上面新开罗表面的方法类似?

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

事实证明,这样做的方法首先是创建一个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 ();
    }
}