如何在开罗裁剪ImageSurface?

时间:2014-08-12 22:47:30

标签: c# gtk cairo

我正在使用C#的Cairo绑定,我希望能够裁剪ImageSurface并将其放入一个新的ImageSurface变量中,然后我将在一个单独的子例程中使用它。问题是如何正确地做到这一点。

这是我的代码:

ImageSurface OutputImage = new ImageSurface (Format.Rgb24, (int)RectangleToCropTo.Width, (int)RectangleToCropTo.Height);
using (Cairo.Context cr = new Cairo.Context(OutputImage)) {
    cr.SetSource (originalImage);
    cr.Rectangle (RectangleToCropTo);
    cr.Clip ();
    cr.Paint ();
}

就目前而言,它确实实际裁剪了图像,并且它似乎从正确的点开始 - 但是OutputImage在x和y轴上偏移了距离左上角0,0的像素数量。选择是。图像没有填充的区域是透明的。

我也尝试了以下内容:

ImageSurface OutputImage = new ImageSurface (Format.Rgb24, (int)RectangleToCropTo.Width, (int)RectangleToCropTo.Height);
using (Cairo.Context cr = new Cairo.Context(OutputImage)) {
    cr.SetSource (originalImage, RectangleToCropTo.X, RectangleToCropTo.Y);
    cr.Rectangle (RectangleToCropTo);
    cr.Clip ();
    cr.Paint ();
}

这个额外的两个参数据说可以标记出来源'应该存储(根据我的理解,' 40,40'将意味着'绘制图像将导致40,40的图像以及它周围和下面的任何图像)。

然而,这既没有为我提供裁剪的图像,而是包含麻烦的偏移并从图像的左上角开始绘制。

我也认为这可能就是解决方案:

ImageSurface OutputImage = new ImageSurface (Format.Rgb24, (int)RectangleToCropTo.Width, (int)RectangleToCropTo.Height);
using (Cairo.Context cr = new Cairo.Context(OutputImage)) {
    cr.SetSource (originalImage, RectangleToCropTo.X, RectangleToCropTo.Y);
    cr.Clip ();
    cr.Paint ();
}

但无济于事,这只会产生与之前代码块相同的结果。

如果你们中的任何一个人能告诉我自己做错了什么(这可能是最愚蠢的错误),我会很感激。

我使用Gtk3附带的Cairo-Sharp。

谢谢:)

2 个答案:

答案 0 :(得分:1)

clip不会调整表面大小,只会屏蔽任何毛发 future 绘制操作。

创建适当大小的新曲面并复制所需(剪裁或非剪裁)区域的内容。

答案 1 :(得分:1)

你几乎得到了它。试试这个:

ImageSurface OutputImage = new ImageSurface (Format.Rgb24, (int)RectangleToCropTo.Width, (int)RectangleToCropTo.Height);
using (Cairo.Context cr = new Cairo.Context(OutputImage)) {
    cr.SetSource (originalImage, -RectangleToCropTo.X, -RectangleToCropTo.Y);
    cr.Paint ();
}

重要的区别是SetSource的负面参数。这将放置源图像,使来自源的(x,y)像素落在目标上的(0,0)像素上。

由于您的目标覆盖了所需的所有像素,因此不再需要您的矩形()和剪辑()调用。