Заполните прямоугольник с большим изображением с Каиром

1

Я разрабатываю приложение в С# с 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.

Спасибо за помощь.

  • 0
    Что именно означает «заполнить прямоугольник» для вас? Вы хотите масштабировать изображение так, чтобы оно охватывало все пиксели вашего прямоугольника? Вы хотите повторить изображение несколько раз, чтобы все было нарисовано?
  • 0
    Я хочу масштабировать изображение, чтобы заполнить все пиксели моего прямоугольника. В настоящее время, если у меня есть прямоугольник 100x100 и изображение 1024x1024, прямоугольник заполняется левой верхней частью изображения, которая соответствует 100x100. Я пытался использовать метод ScaleSimple на моем Pixbuf, работаю хорошо, но это решение замедляет мое приложение, и кажется сложным воссоздать pixbuf. Поэтому я ищу более быстрое решение.
Показать ещё 1 комментарий
Теги:
mono
cairo
gtk
gdk

1 ответ

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. С помощью этого решения нет необходимости воссоздавать Pixbuf с помощью ScaleSimple, и приложение не замедляется.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню