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