2009-10-03 11 views
6

Ich schreibe ein Tool, um einige unserer Asset-Making für ein Spiel zu automatisieren. Ich möchte einen Ordner mit PNG-Dateien erstellen, sie zu einem Texturatlas kombinieren und dann den Atlas als TGA und die UV-Koordinaten in XML exportieren.Wie kann man PNGs laden und nach TGA exportieren, um Alpha in C# zu behalten?

Ich bin mir nicht sicher, welche Methode ich verwenden sollte, um die PNG-Dateien in C# zu laden, da es mehrere zu sein scheinen. Was ist die empfohlene Methode zum Laden von Bildern in C#, die Zugriff auf die Farb-/Alpha-Daten gibt, damit ich sie in den TGA extrahieren kann?

Ich habe auch bereits TGA-Erstellungscode in C++, den ich nach C# verschieben möchte, aber ich frage mich, ob es bereits etwas in .Net zum Erstellen/Speichern von TGAs gibt?

Danke fürs Lesen.

Antwort

8

eine PNG-Datei in eine .NET Bitmap Laden ist einfach:

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

Sobald Sie die Bitmap geladen haben, können Sie werden alle Informationen (einschließlich Alphakanal info) Zugriff am effizientesten die LockBits Methode des Bitmap mit (Es gibt viele LockBits-Codebeispiele in StackOverflow).

aktualisieren: hier ist ein Codebeispiel, das zeigt, wie LockBits verwenden, um die Daten Pixel-für-Pixel-Bitmap zuzugreifen:

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

Sie müssen sich für die "Allow unsicheren Code" Compiler-Option setzen Ihre Projekt, um diesen Code zu verwenden. Sie können auch die GetPixel (x, y) -Methode der Bitmap verwenden, aber das ist erstaunlich langsam.

+0

Die Umwandlung ist notwendig, da Bitmap.FromFile nicht existiert - sie ruft die statische Methode Image.FromFile der Basisklasse auf. – bobbymcr

+0

@bobbymcr: Sicher, aber warum nicht Bitmap überschreiben FromFile, base.FromFile aufrufen und das zurückgegebene Bild als Bitmap? – MusiGenesis

0

ich nicht ein Code-Beispiel, aber ich kann Ihnen eine Leitlinie

  1. laden PNG mit Image.FromFile() geben. .NET unterstützt das Laden von PNG
  2. Öffnen Sie ein Dateihandle zu Ihrem Targa. Erstellen Sie ein XmlDocument. .NET unterstützt Targa nicht, Sie müssen es also manuell schreiben.
  3. Sperren Sie die Bitmap, um an die Pixel zu gelangen. GetPixel() ist sehr langsam. Ich denke, die Methode heißt LockBits(). Sie erhalten einen Zeiger auf die Oberfläche, um die Pixel zu lesen
  4. Schreiben Sie an targa. Targa ist ein Containerformat, also sollte jede Bitmap passen.
  5. Speichern Sie die UV als Xml.

Targa format

Haben Sie eine Palette verwenden möchten? Da Sie ein Spiel machen, würde ich Ihnen empfehlen, eine Palette für Ihre Bitmaps zu berechnen und diese in den Targa zu legen, um die Dateigröße zu reduzieren.

Oh, bevor ich es vergesse, verwendet .NET nicht RGBA, stattdessen sind die Pixel BGRA. Frag mich nicht warum, aber es ist so.