代码之家  ›  专栏  ›  技术社区  ›  Christine

如何在开罗裁剪ImageSurface?

  •  1
  • Christine  · 技术社区  · 10 年前

    我正在为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附带的开罗夏普。

    谢谢:)

    2 回复  |  直到 10 年前
        1
  •  1
  •   Uli Schlachter    10 年前

    你几乎做到了。试试这个:

    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)像素上。

    由于目标覆盖了所需的所有像素,因此不再需要rectangle()和clip()调用。

        2
  •  1
  •   drahnr    10 年前

    clip 不调整曲面的大小,它只是掩盖任何毛发 将来 绘制操作。

    创建一个大小合适的新曲面,并复制所需(剪切或未剪切)区域的内容。