2009-10-03 12 views
6

Piszę narzędzie do automatyzacji niektórych naszych aktywów tworzenia gry. Co chcę zrobić, to wziąć folder plików PNG, połączyć je w atlas tekstury, a następnie wyeksportować atlas jako TGA i UV Coord do XML.Jak załadować pliki PNG i eksportować je do TGA przechowując alfa w języku C#?

Nie jestem pewien, którą metodę należy użyć do załadowania plików PNG w języku C#, ponieważ wydaje się, że jest ich kilka. Jaka jest zalecana metoda ładowania obrazów w języku C#, która daje dostęp do danych kolorów/alfa, aby można je było wyodrębnić do TGA?

Mam również kod tworzenia TGA w C++, który zamierzam przenieść do C#, ale zastanawiam się, czy jest coś już dostępnego w .Net do tworzenia/zapisywania TGA?

Dzięki za przeczytanie.

Odpowiedz

8

Ładowanie pliku PNG w Net Bitmap jest proste:

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

Po bitmapy załadowany, można uzyskać dostęp do wszystkich swoich informacji (w tym informacji kanału alfa) najbardziej efektywne wykorzystanie LockBits metody bitmapy za (istnieje wiele próbek kodu LockBits na StackOverflow).

Aktualizacja: oto przykładowy kod, który pokazuje, jak używać LockBits dostęp do danych piksel po pikselu bitmapy za:

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); 

trzeba ustawić „Zezwalaj niebezpieczny kod” opcję kompilatora dla Twojego projekt do używania tego kodu. Możesz również użyć metody BitPap (x, y) GetPixel, ale jest to niesamowicie powolne.

+0

Oddanie jest konieczne, ponieważ Bitmap.FromFile w rzeczywistości nie istnieje - wywołuje metodę klasy statycznej "Image.FromFile". – bobbymcr

+0

@bobbymcr: jasne, ale dlaczego Bitmap nie zastępuje FromFile, wywołuje base.FromFile i rzuca zwracany obraz jako bitmapę? – MusiGenesis

0

nie mam próbkę kodu, ale może dać wskazówkę

  1. PNG Załaduj korzystając Image.FromFile(). .NET obsługuje ładowanie PNG
  2. Otwórz uchwyt pliku do swojego targa. Utwórz dokument XmlDocument. .NET nie obsługuje targa, więc musisz go ręcznie zapisać.
  3. Zablokuj mapę bitową, aby uzyskać piksele. GetPixel() jest bardzo wolny. Myślę, że metoda nazywa się LockBits(). Otrzymasz wskaźnik na powierzchnię, aby odczytać piksele
  4. Napisz do targa. Targa jest formatem kontenera, więc każda bitmapa powinna pasować.
  5. Zapisz UV jako Xml.

Targa format

Chcesz wykorzystać paletę? Od tworzenia gry zalecam obliczenie palety bitmap i umieszczenie jej w targa, aby zmniejszyć rozmiar pliku.

O, zanim zapomnę, .NET nie używa RGBA, zamiast tego piksele to BGRA. Nie pytaj mnie dlaczego, ale tak to wygląda.

Powiązane problemy