Я разрабатываю приложение в С# с GTk. В этом приложении я должен отображать поля. Некоторые из них заполнены цветом, а другие - с изображением. Эти коробки можно изменять и перемещать. Ящики отображаются в DrawingArea.
Когда я рисую изображение с каирским контекстом, изображение не заполняет поле полностью, если изображение больше, чем поле. Я пробовал некоторые решения, такие как использование метода ScaleSimple на Pixbuf каждый раз при изменении размера окна, но когда ящик большой, приложение становится медленным. И создать новый экземпляр 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 a Pixbuf.
Спасибо за помощь.
Наконец нашел решение.
Просто нужно масштабировать, прежде чем рисовать изображение. Таким образом, изображение всегда будет иметь одинаковый размер определенного прямоугольника.
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. С помощью этого решения нет необходимости воссоздавать Pixbuf с помощью ScaleSimple, и приложение не замедляется.