2013-04-21 2 views
1

Я пытаюсь обрезать текстуру2d в xna. я нашел следующий код, который обрезает изображение в верхней и правой сторонах, я играл с кодом и не могу определить способ обрезать все стороны с определенным интервалом. ниже приведен код, который я пытался изменить:Обрезка texture2d со всех сторон в xna C#

Любая помощь или идеи были бы высоко оценены.

Rectangle area = new Rectangle(0, 0, 580, 480); 

     Texture2D cropped = new Texture2D(heightMap1.GraphicsDevice, area.Width, area.Height); 
     Color[] data = new Color[heightMap1.Width * heightMap1.Height]; 
     Color[] cropData = new Color[cropped.Width * cropped.Height]; 

     heightMap1.GetData(data); 

     int index = 0; 


     for (int y = 0; y < area.Y + area.Height; y++) // for each row 
     { 

       for (int x = 0; x < area.X + area.Width; x++) // for each column 
       { 
        cropData[index] = data[x + (y * heightMap1.Width)]; 
        index++; 
       } 

     } 

    cropped.SetData(cropData); 
+0

Что случилось с ним? Что вызывает проблемы? – Cyral

+0

Мне нужно обрезать 20 пикселей со всех сторон изображения, это только обрезает 20 с верхней и правой стороны :( –

+0

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

ответ

2

Вот код для обрезки текстуры. Обратите внимание, что метод GetData уже может выбрать прямоугольный подраздел изображения - нет необходимости вручную обрезать.

// Get your texture 
Texture2D texture = Content.Load<Texture2D>("myTexture"); 

// Calculate the cropped boundary 
Rectangle newBounds = texture.Bounds; 
const int resizeBy = 20; 
newBounds.X += resizeBy; 
newBounds.Y += resizeBy; 
newBounds.Width -= resizeBy * 2; 
newBounds.Height -= resizeBy * 2; 

// Create a new texture of the desired size 
Texture2D croppedTexture = new Texture2D(GraphicsDevice, newBounds.Width, newBounds.Height); 

// Copy the data from the cropped region into a buffer, then into the new texture 
Color[] data = new Color[newBounds.Width * newBounds.Height]; 
texture.GetData(0, newBounds, data, 0, newBounds.Width * newBounds.Height); 
croppedTexture.SetData(data); 

Конечно, иметь в виду, что SpriteBatch.Draw может принимать параметр sourceRectangle, так что вы можете даже не нужно копировать данные текстуры вокруг на всех! Просто используйте подраздел исходной текстуры. Например:

spriteBatch.Draw(texture, Vector2.Zero, newBounds, Color.White); 

(где newBounds рассчитывается таким же образом, как и в первом листинге кода.)

+0

приветствия andrew, что именно то, что мне нужно :) thankyou –

 Смежные вопросы

  • Нет связанных вопросов^_^