Domanda

Sto scrivendo uno strumento per automatizzare alcuni dei nostro fare bene per un gioco. Quello che voglio fare è prendere una cartella di file PNG, combinarle in una texture atlante e quindi esportare l'atlante come TGA e le coordinate UV per XML.

Non sono sicuro di quale metodo devo usare per caricare i file PNG in C #, come sembra che ci siano diversi. Qual è il metodo consigliato per caricare le immagini in C # che consente l'accesso ai dati di colore / alfa in modo da poter estrarre il TGA?

Ho anche già TGA codice di creazione in C ++ che ho in programma di passare a C #, ma mi chiedo se c'è qualcosa già disponibile in .NET per creare / salvare TGAs?

Grazie per la lettura.

È stato utile?

Soluzione

Il caricamento di un file PNG in un Net bitmap è facile:

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

Una volta che avete il bitmap caricata, è possibile accedere a tutti le informazioni (comprese le informazioni canale alfa) in modo più efficiente con il metodo LockBits del bitmap (ci sono molti esempi di codice LockBits su StackOverflow).

Aggiorna : ecco un esempio di codice che mostra come utilizzare LockBits per accedere al bitmap dati pixel-by-pixel:

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

È necessario impostare l'opzione del compilatore "Consenti codice non sicuro" per il vostro progetto per utilizzare questo codice. Si potrebbe anche utilizzare il metodo GetPixel (x, y) della bitmap, ma questo è incredibilmente lento.

Altri suggerimenti

Non ho un esempio di codice, ma posso dargli una linea guida

  1. PNG carico utilizzando Image.FromFile (). .NET supporta il caricamento PNG
  2. Aprire un handle di file al vostro targa. Creare un XmlDocument. .NET doesnt supporto targa, quindi si deve scrivere manualmente.
  3. Bloccare il bitmap per ottenere i pixel. GetPixel () è molto lento. Credo che il metodo è chiamato LockBits (). Si ottiene un puntatore alla superficie per leggere i pixel
  4. Scrivi targa. Targa è un formato contenitore, in modo che qualsiasi bitmap dovrebbe andare bene.
  5. Salvare il UV come Xml.

formato Targa

Vuoi utilizzare una tavolozza? Dal momento che il fare un gioco, ti consiglierei di calcolare una tavolozza per i tuoi bitmap e mettere che nella targa per ridurre le dimensioni del file.

Ah, prima che mi dimentichi, .NET uso doesnt RGBA, invece, i pixel sono BGRA. Dont mi chiedono perché, ma il suo genere.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top