Come caricare PNG e l'esportazione in TGA custodia alfa in C #?
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.
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
- PNG carico utilizzando Image.FromFile (). .NET supporta il caricamento PNG
- Aprire un handle di file al vostro targa. Creare un XmlDocument. .NET doesnt supporto targa, quindi si deve scrivere manualmente.
- 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
- Scrivi targa. Targa è un formato contenitore, in modo che qualsiasi bitmap dovrebbe andare bene.
- Salvare il UV come Xml.
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.