2009-03-19 6 views
5

XNA 게임 (편집기도 XNA에 있음)을 위해 만든 레벨 편집기에서 Texture2D 개체의 크기를 조정할 수 있습니다.XNA에서 Texture2D의 크기를 조정하고 저장하는 방법?

사용자가 레벨을 저장하려고 할 때 게임에서 크기 조정이 필요하지 않도록 실제로 디스크의 이미지 파일 크기를 조정하고 싶습니다.

크기가 조정 된 Texture2D 개체에서 이미지 파일 (PNG 선호)을 쉽게 만들 수 있습니까?

답변

11

원하는 크기로 렌더링 대상에 렌더링 한 다음 렌더링 대상 텍스처를 저장하여 텍스처의 크기를 조절할 수 있습니다.

이 간단한 예제는 어떻게 수행 할 수 있는지 보여줍니다. GraphicsDevice의 설정을 무시하십시오. 작은 자체 포함 예제 만 만들면됩니다. 흥미로운 점은 렌더링 타겟을 만들고 스케일 된 텍스처를 그리는 것입니다. 가능한 경우 렌더 타겟을 재사용해야합니다 (같은 크기의 모든 이미지가 렌더 타겟을 재사용 할 수 있습니다).

using System; 
using System.Runtime.InteropServices; 
using Microsoft.Xna.Framework; 
using Microsoft.Xna.Framework.Graphics; 

class Program 
{ 
    [DllImport("kernel32.dll", SetLastError = true)] 
    private static extern IntPtr GetConsoleWindow(); 

    static void Main(string[] args) 
    { 
     string sourceImagePath = args[0]; 
     string destinationImagePath = args[1]; 
     int desiredWidth = int.Parse(args[2]); 
     int desiredHeight = int.Parse(args[3]); 

     GraphicsDevice graphicsDevice = new GraphicsDevice(
      GraphicsAdapter.DefaultAdapter, 
      DeviceType.Hardware, 
      GetConsoleWindow(), 
      new PresentationParameters()); 
     SpriteBatch batch = new SpriteBatch(graphicsDevice); 

     Texture2D sourceImage = Texture2D.FromFile(
      graphicsDevice, sourceImagePath); 

     RenderTarget2D renderTarget = new RenderTarget2D(
      graphicsDevice, 
      desiredWidth, desiredHeight, 1, 
      SurfaceFormat.Color); 

     Rectangle destinationRectangle = new Rectangle(
      0, 0, desiredWidth, desiredHeight); 

     graphicsDevice.SetRenderTarget(0, renderTarget); 

     batch.Begin(); 
     batch.Draw(sourceImage, destinationRectangle, Color.White); 
     batch.End(); 

     graphicsDevice.SetRenderTarget(0, null); 

     Texture2D scaledImage = renderTarget.GetTexture(); 
     scaledImage.Save(destinationImagePath, ImageFileFormat.Png); 
    } 
} 
+2

이것은 구현을 마친 것에 가장 가깝습니다. kernel32 import 나 GetConsoloWindow를 사용하지는 않았지만 단순히 Game 객체의 GraphicsDevice를 사용했습니다. –

0

Texture2D.Save()을 사용해 보셨습니까?

+0

Texture2D의 크기가 올바르지 만 그리기 호출로 크기 조절이 수행되면 어떻게됩니까? 크기가 조정 된 Texture2D 개체는 어떻게 만듭니 까? –

0

이미지 크기를 조정해도 일반적으로 많은 오버 헤드가 발생하지 않으며, 같은 크기의 다른 크기의 메모리를 낭비하지 않으려 고합니다.

물론 Zune 게임을 쓰는 사람이 될 수 있습니다. 즉, 어쩌면 내가 거기에서 스케일링을하지 않을 수도 있습니다.

XNA에서 크기 조정 된 이미지를 직접 저장할 수 있다고 생각하지 않지만 WinForms Image 클래스를 사용하여 이미지를로드 한 다음 레벨 편집기에서 크기를 조정하고 다시 디스크에 저장합니다.

질감이 BMP 또는 PNG가 아닌 경우 Texture2D.Save() 명령을 사용하여 Image 클래스에서 사용할 수있는 형식으로 변환해야 할 수도 있습니다.

이 스레드는 Image 클래스 사용에 도움이 될 수 있습니다. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6fe3d353-0b09-440b-95c9-701efdc9e20a/

+0

나는 내 충돌 코드를 간단하게 유지하기 위해 게임 내 스케일링을 피하고 싶습니다. –

0

텍스처의 크고 작은 복사본을 만드는 코드가 있는데 잠시 후에 오류가 발생합니다. 30 크기 조정 후 나는 처음이 아니라 예외를 얻는다.

렌더링 대상에 문제가있는 것 같지만 잘 모르겠습니다. 이 코드를 너무 많이 실행하면 이러한 예외가 발생할지 궁금합니다.

관련 문제