2013-04-21 147 views
1

我想在xna中裁剪texture2d。我發現下面的代碼會在上面和右側裁剪圖像,我玩過代碼並且無法想象在特定時間間隔內裁剪所有面的方法。下面是我一直試圖修改的代碼:在xna c中裁剪texture2d#

任何幫助或想法將不勝感激。

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 2013-04-22 00:27:56

+0

我需要在圖像的所有邊上裁剪20個像素,這隻會從頂部和右側裁剪20個像素:( – 2013-04-22 00:50:23

+0

您是否需要剪裁紋理並將輸出提供給用戶作爲某種類型的下載或做你必須繪製紋理裁剪?如果你試圖畫出一些較大的紋理部分到屏幕上,那麼影響 – 2013-04-22 01:03:14

回答

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

乾杯安德魯,正是我需要:)謝謝你 – 2013-04-22 08:44:12