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

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

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

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

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

2 ответов


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

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

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

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

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 с помощью изображения.FromFile(). .NET поддерживает загрузку PNG
  2. откройте дескриптор файла в targa. Создание объекта XmlDocument. .NET не поддерживает targa, поэтому вам нужно вручную написать его.
  3. блокировка растрового изображения, чтобы добраться до пикселей. GetPixel () очень медленный. Я думаю, что метод называется LockBits (). Вы получаете указатель на поверхность, чтобы прочитать пикселей
  4. напишите тарга. Targa-это формат контейнера, поэтому любое растровое изображение должно соответствовать.
  5. сохраните UV как Xml.

формат Targa

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

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