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

Можно извлечь/заменить/объединить/проверить декларации с помощью инструмента декларации командной строки, mt.exe, который является частью Windows SDK:

C:\Program Files\Microsoft SDKs\Windows\v6.1>mt /?
Microsoft (R) Manifest Tool version 5.2.3790.2075
...
> To extract manifest out of a dll:
mt.exe -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest

РЕДАКТИРОВАНИЕ: Я нашел инструмент в C:\Program Files\Microsoft SDKs\Windows\v6.1\bin

6
задан Kath 3 October 2009 в 21:01
поделиться

2 ответа

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

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

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

8
ответ дан 10 December 2019 в 02:50
поделиться

У меня нет образца кода, но я могу дать вам руководство

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

Формат Targa

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

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

1
ответ дан 10 December 2019 в 02:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: