Как загрузить PNG и экспортировать в TGA, сохраняя альфа в C#?

StackOverflow https://stackoverflow.com/questions/1514846

  •  19-09-2019
  •  | 
  •  

Вопрос

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

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

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

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

Это было полезно?

Решение

Загрузить файл PNG в растровый карту .NET легко:

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

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

Обновлять: Вот образец кода, который показывает, как использовать салоны для доступа к пикселям данных 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. Загрузите png с помощью image.fromfile (). .NET поддерживает загрузку PNG
  2. Откройте дескриптор файла для вашей Targa. Создайте Xmldocument. .Net не поддерживает Targa, поэтому вам нужно вручную написать ее.
  3. Заблокируйте растровый карту, чтобы добраться до пикселей. GetPixel () очень медленный. Я думаю, что метод назван Lockbits (). Вы получаете указатель на поверхность, чтобы прочитать пиксели
  4. Напишите Targa. Targa - это формат контейнера, поэтому любая растровая карта должна соответствовать.
  5. Сохраните УФ как XML.

Формат Тарга

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top