Frage

Ich schreibe ein Tool, um einen Teil unseres Vermögens für ein Spiel zu automatisieren. Ich möchte einen Ordner von PNG -Dateien aufnehmen, sie zu einem Texturatlas kombinieren und dann den Atlas als TGA und die UV -Koordnungen nach XML exportieren.

Ich bin mir nicht sicher, mit welcher Methode ich die PNG -Dateien in C# laden sollte, da es anscheinend mehrere gibt. Was ist die empfohlene Methode zum Laden von Bildern in C#, mit dem Zugriff auf die Farb-/Alpha -Daten zugänglich ist, damit ich sie an die TGA extrahieren kann?

Ich habe auch bereits TGA -Erstellungscode in C ++, den ich zu C# übergehen möchte, aber ich frage mich, ob es in .NET bereits etwas verfügbar gibt, um TGAs zu erstellen/zu speichern.

Danke fürs Lesen.

War es hilfreich?

Lösung

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

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

Sobald Sie den Bitmap geladen haben, können Sie auf alle seine Informationen (einschließlich Alpha -Kanal -Info) zugreifen, die am effizientesten mit der Lockbits -Methode des Bitmap (es gibt viele Lockbit -Code -Samples auf Stackoverflow).

Aktualisieren: Hier ist ein Code-Beispiel, mit dem Lockbits verwendet werden, um auf das Datenpixel-By-Pixel des 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 die Option "Unsicherer Code zulassen" -Kompiler -Option für Ihr Projekt festlegen, um diesen Code zu verwenden. Sie können auch die GetPixel (X, Y) -Methode der Bitmap verwenden, aber dies ist erstaunlich langsam.

Andere Tipps

Ich habe kein Code -Beispiel, aber ich kann Ihnen eine Richtlinie geben

  1. Laden Sie PNG mit Image.fromFile (). .NET unterstützt das Laden von PNG
  2. Öffnen Sie einen Dateihandle für Ihr Targa. Erstellen Sie ein xmldocument. .NET unterstützt Targa nicht, also müssen Sie es 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, daher sollte jede Bitmap passen.
  5. Speichern Sie den UV als XML.

Targa -Format

Möchten Sie eine Palette verwenden? Da Sie ein Spiel machen, würde ich empfehlen, eine Palette für Ihre Bitmaps zu berechnen und dies in die Targa zu setzen, um die Dateigröße zu reduzieren.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top