我正在使用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。
谢谢:)
答案 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)像素上。
由于您的目标覆盖了所需的所有像素,因此不再需要您的矩形()和剪辑()调用。