2014-09-01 6 views
1

Я разрабатываю приложение в C# с GTk. В этом приложении я должен отображать поля. Некоторые из них заполнены цветом, а другие - с изображением. Эти коробки можно изменять и перемещать. Ящики отображаются в DrawingArea.Заполните прямоугольник большим изображением с помощью Cairo

Когда я рисую изображение в контексте Каира, изображение не заполняет поле полностью, если изображение больше, чем поле. Я пробовал некоторые решения, такие как использование метода 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 экземпляр Pixbuf.

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

+0

Что именно означает «заполнить прямоугольник» для вас? Вы хотите масштабировать изображение так, чтобы оно охватывало все пиксели вашего прямоугольника? Вы хотите повторить изображение несколько раз, чтобы все было нарисовано? –

+0

Я хочу масштабировать изображение, чтобы заполнить все пиксели моего прямоугольника. В настоящее время, если у меня есть прямоугольник размером 100x100 и изображение 1024x1024, прямоугольник заполняется верхней левой частью изображения, соответствующей 100x100. Я попытался использовать метод ScaleSimple на своем Pixbuf, хорошо работаю, но это решение замедляет мое приложение, и кажется, что он воссоздает pixbuf. Поэтому я ищу более быстрое решение. –

+0

Uhm, так что вы хотите кэшировать ваши масштабированные поверхности? Возможно, если у вас есть 1024x1024, вы можете кэшировать 512x512, 256x256 и т. Д. И использовать самый близкий? Возможно, также кешируйте тот, который соответствует текущему размеру прямоугольника. Масштабирование происходит медленно, этого не может быть сделано, поэтому его следует избегать –

ответ

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, и приложение не замедляется.