用Cairo填充带有更大图像的矩形

时间:2014-09-01 08:49:47

标签: c# mono gtk cairo gdk

我正在使用GTk在C#中开发一个应用程序。在这个应用程序中,我必须显示框。一些充满了颜色,另一些充满了图像。这些盒子可调整大小并可移动。框显示在DrawingArea中。

当我使用Cairo上下文绘制图像时,如果图像大于框,则图像不会完全填满框。我已经尝试过一些解决方案,比如每次调整框大小时在Pixbuf上使用ScaleSimple方法,但是当框大时,应用程序会变慢。每次创建一个新的Pixbuf实例并不是一个好方法,因为性能对我的应用程序很重要。

我在文档和互联网上搜索了是否有参数告诉开罗用图像填充矩形,但我什么也没找到。

这是我绘制图像的代码:

context.Translate(Bounds.X, Bounds.Y);
CairoHelper.SetSourcePixbuf(context, _source.Buffer, 0.0d, 0.0d);
context.Rectangle(0.0d, 0.0d, Bounds.Width, Bounds.Height);
context.Fill();

Bounds是一个Gdk.Rectangle,_source.Buffer是一个Pixbuf实例。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

终于找到了解决方案。

在绘制图像之前只需要缩放。就像那样,图像将始终与定义的矩形具有相同的大小。

float xScale = (float)rectangle.Width / (float)buffer.Width;
float yScale = (float)rectangle.Height / (float)buffer.Height;
context.Translate(rectangle.X, rectangle.Y);
context.Scale(xScale, yScale);

CairoHelper.SetSourcePixbuf(context, buffer, 0.0d, 0.0d);
context.Paint();

名为buffer的变量是一个Pixbuf实例。使用此解决方案,无需使用ScaleSimple重新创建Pixbuf,并且应用程序不会变慢。