2009-10-03 7 views
6

Estoy escribiendo una herramienta para automatizar algunos de nuestros activos para un juego. Lo que quiero hacer es tomar una carpeta de archivos PNG, combinarlos en un atlas de textura y luego exportar el atlas como un TGA y los coords UV a XML.Cómo cargar PNG y exportar a TGA manteniendo alfa en C#?

No estoy seguro de qué método debo usar para cargar los archivos PNG en C#, ya que parecen ser varios. ¿Cuál es el método recomendado para cargar imágenes en C# que da acceso a los datos de color/alfa para que pueda extraerlo al TGA?

También tengo código de creación TGA en C++ que planeo mover a C#, pero me pregunto si ya hay algo disponible en .Net para crear/guardar TGAs.

Gracias por leer.

Respuesta

8

Carga de un archivo PNG en un .Net mapa de bits es fácil:

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

Una vez que haya cargado el mapa de bits, puede acceder a toda su información (incluyendo la información del canal alfa) más eficiente utilizando el método LockBits del mapa de bits (hay muchos ejemplos de código LockBits en StackOverflow).

actualización: aquí hay un ejemplo de código que muestra cómo utilizar LockBits acceder a píxel por píxel de datos del mapa de bits:

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

Es necesario configurar la opción de compilador de "código no seguro Permitir" su proyecto para usar este código. También puede usar el método GetPixel (x, y) del Bitmap, pero esto es sorprendentemente lento.

+0

El molde es necesario porque Bitmap.FromFile no existe en realidad - está llamando al método estático de la clase base Image.FromFile. – bobbymcr

+0

@bobbymcr: seguro, pero ¿por qué Bitmap no reemplaza a FromFile, no llama a base.FromFile y emite la imagen devuelta como un mapa de bits? – MusiGenesis

0

no tengo un ejemplo de código, pero yo le puede dar una pauta

  1. PNG carga usando Image.FromFile(). .NET admite la carga de PNG
  2. Abra un identificador de archivo para su targa. Crea un XmlDocument. .NET no admite targa, por lo que debe escribirlo manualmente.
  3. Bloquee el mapa de bits para obtener los píxeles. GetPixel() es muy lento. Creo que el método se llama LockBits(). Obtienes un puntero a la superficie para leer los píxeles
  4. Escribir a targa. Targa es un formato contenedor, por lo que cualquier mapa de bits debería caber.
  5. Guarde el UV como Xml.

Targa format

¿Quieres usar una paleta? Dado que estás haciendo un juego, te recomendaría que calcules una paleta para tus mapas de bits y los pongas en la targa para reducir el tamaño del archivo.

Ah, antes de que me olvide, .NET no usa RGBA, en cambio, los píxeles son BGRA. No me preguntes por qué, pero es así.

Cuestiones relacionadas