Как изменить размер и сохранить Texture2D в XNA? - PullRequest
5 голосов
/ 20 марта 2009

В редакторе уровней, который я сделал для своей игры XNA (редактор также в XNA), я позволяю масштабировать Texture2D объекты.

Когда пользователь пытается сохранить уровень, я бы на самом деле хотел изменить размер файла изображения на диске, чтобы он не требовал масштабирования в игре.

Есть ли простой способ создать файл изображения (предпочтительно PNG) из масштабированного объекта Texture2D?

Ответы [ 4 ]

11 голосов
/ 01 апреля 2009

Вы можете масштабировать ваши текстуры, рендеринг к цели рендера в нужном размере и затем сохранение текстуры цели рендеринга.

Этот простой пример показывает, как вы можете это сделать. Не обращайте внимания на настройку 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);
    }
}
0 голосов
/ 28 сентября 2009

У меня есть такой код, который делает большую / меньшую копию текстуры, но через некоторое время я получаю ошибки. После 30 изменений размера я получаю исключение, а не в первый раз.

Кажется, это проблема рендера, но я не уверен. Интересно, вы тоже получите эти исключения, если будете часто запускать этот код?

0 голосов
/ 20 марта 2009

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

Конечно, вы могли бы писать игру для Zune, а это значит, что я, вероятно, не собираюсь делать там масштабирование, но, в любом случае.

Я не думаю, что вы можете сохранить масштабированное изображение непосредственно из XNA, но вы можете использовать класс образов WinForms для загрузки изображения, а затем масштабировать его до размеров в редакторе уровней и сохранить обратно на диск.

Если ваша текстура не BMP или PNG, вам, возможно, придется использовать команду Texture2D.Save (), чтобы преобразовать ее в формат, который вы можете использовать в классе Image.

Эта тема может помочь вам с использованием класса Image. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/6fe3d353-0b09-440b-95c9-701efdc9e20a/

0 голосов
/ 20 марта 2009

Вы пробовали Texture2D.Save () ?

...