Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用Cairo填充一个大的矩形_C#_Mono_Gtk_Cairo_Gdk - Fatal编程技术网

C# 用Cairo填充一个大的矩形

C# 用Cairo填充一个大的矩形,c#,mono,gtk,cairo,gdk,C#,Mono,Gtk,Cairo,Gdk,我正在用GTk开发一个C#应用程序。在这个应用程序中,我必须显示框。有些是用颜色填充的,有些是用图像填充的。这些盒子可以调整大小和移动。框显示在绘图区域中 当我用Cairo上下文绘制图像时,如果图像大于框,则图像不会完全填充框。我尝试过一些解决方案,比如每次调整盒子的大小时在Pixbuf上使用ScaleSimple方法,但是当盒子很大时,应用程序就会变慢。每次创建一个新的Pixbuf实例并不是一个好方法,因为性能对我的应用程序很重要 我在文档和互联网上搜索过是否有一个参数告诉Cairo用图像填充

我正在用GTk开发一个C#应用程序。在这个应用程序中,我必须显示框。有些是用颜色填充的,有些是用图像填充的。这些盒子可以调整大小和移动。框显示在绘图区域中

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

我在文档和互联网上搜索过是否有一个参数告诉Cairo用图像填充矩形,但我没有找到任何结果

以下是我绘制图像的代码:

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和一个Pixbuf实例的_source.Buffer


谢谢你的帮助。

终于找到了解决方案

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

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,应用程序也不会减慢速度。

对您来说,“填充矩形”到底意味着什么?是否要缩放图像,使其覆盖矩形的所有像素?你想重复图像多次以便绘制所有内容吗?我想缩放图像以填充矩形的所有像素。当前,如果我有一个100x100的矩形和一个1024x1024的图像,则该矩形将填充与100x100对应的图像左上部分。我曾尝试在我的Pixbuf上使用ScaleSimple方法,效果很好,但此解决方案会减慢我的应用程序的速度,并且重新创建Pixbuf似乎很繁重。所以我在寻找一个更快的解决方案。嗯,那么你想缓存你的缩放曲面?如果您有一个1024x1024,您可以缓存512x512、256x256等,并使用最近的一个?也可以缓存适合当前矩形大小的矩形。缩放速度很慢,没有什么可以做的,所以应该避免