Как загрузить PNG и экспортировать в TGA, сохраняя альфа в C #? - PullRequest
6 голосов
/ 04 октября 2009

Я пишу инструмент, позволяющий автоматизировать создание некоторых наших активов для игры. Я хочу взять папку с файлами PNG, объединить их в текстурный атлас и затем экспортировать атлас в виде TGA и UV-координаты в XML.

Я не уверен, какой метод мне следует использовать для загрузки файлов PNG в C #, поскольку их, похоже, несколько. Каков рекомендуемый метод загрузки изображений в C #, который дает доступ к цветным / альфа-данным, чтобы я мог извлечь их в TGA?

У меня также есть код для создания TGA на C ++, который я планирую переместить на C #, но мне интересно, есть ли в .Net что-нибудь уже для создания / сохранения TGA?

Спасибо за чтение.

Ответы [ 2 ]

8 голосов
/ 04 октября 2009

Загрузка файла PNG в растровое изображение .Net очень проста:

Bitmap bmp = (Bitmap)Bitmap.FromFile("c:\wherever\whatever.png");
// yes, the (Bitmap) cast is necessary. Don't ask me why.

После загрузки растрового изображения вы можете наиболее эффективно получить доступ ко всей его информации (включая информацию о альфа-канале), используя метод LockBits для растрового изображения (в StackOverflow имеется много примеров кода LockBits).

Обновление : вот пример кода, который показывает, как использовать LockBits для доступа к данным Bitmap попиксельно:

System.Drawing.Imaging.BitmapData data =
    bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
    System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat);
unsafe
{
    // important to use the BitmapData object's Width and Height
    // properties instead of the Bitmap's.
    for (int x = 0; x < data.Width; x++)
    {
        int columnOffset = x * 4;
        for (int y = 0; y < data.Height; y++)
        {
            byte* row = (byte*)data.Scan0 + (y * data.Stride);
            byte B = row[columnOffset];
            byte G = row[columnOffset + 1];
            byte R = row[columnOffset + 2];
            byte alpha = row[columnOffset + 3];
        }
    }
}
bmp.UnlockBits(data);

Вам необходимо установить опцию компилятора «Разрешить небезопасный код», чтобы ваш проект использовал этот код. Вы также можете использовать метод GetPixel (x, y) растрового изображения, но это удивительно медленно.

1 голос
/ 04 октября 2009

У меня нет примера кода, но я могу дать вам руководство

  1. Загрузить PNG с помощью Image.FromFile (). .NET поддерживает загрузку PNG
  2. Откройте дескриптор файла для вашей targa. Создайте XmlDocument. .NET не поддерживает targa, поэтому вы должны написать его вручную.
  3. Заблокируйте растровое изображение, чтобы получить пиксели. GetPixel () очень медленный. Я думаю, что метод называется LockBits (). Вы получаете указатель на поверхность для чтения пикселей
  4. Написать в таргу. Targa - это контейнерный формат, поэтому подойдет любое растровое изображение.
  5. Сохранить УФ как XML.

Формат Targa

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

О, прежде чем я забуду, .NET не использует RGBA, вместо этого пиксели - это BGRA. Не спрашивайте меня, почему, но это так.

...