Pregunta

Estoy escribiendo una herramienta para automatizar algunas de nuestra toma de activos para un juego. Lo que quiero hacer es tomar una carpeta de archivos PNG, combinarlos en una textura de Atlas y luego exportar el atlas como un TGA y las coordenadas UV a XML.

No estoy seguro de qué método debo utilizar para cargar los archivos PNG en C # como parece que hay 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 a la TGA?

También ya tengo código de creación de TGA en C ++ que pienso mover a C #, pero me pregunto si hay algo que ya está disponible en .NET para crear / guardar los TGA?

Gracias por la lectura.

¿Fue útil?

Solución

La 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).

Actualizar : aquí hay un ejemplo de código que muestra cómo utilizar LockBits para acceder al mapa de bits de datos de píxel a píxel:

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 "Permitir código no seguro" para su proyecto de utilizar este código. También es posible usar el método GetPixel (x, y) del mapa de bits, pero esto es increíblemente lento.

Otros consejos

No tengo un ejemplo de código, pero puedo darle una directriz

  1. Carga PNG utilizando Image.FromFile (). .NET admite cargar PNG
  2. Abre un identificador de archivo para su Targa. Crear un XmlDocument. .NET duerma Targa apoyo, por lo que tiene que escribir manualmente.
  3. Bloquear el mapa de bits para llegar a los píxeles. GetPixel () es muy lento. Creo que el método se denomina LockBits (). Se obtiene 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 debe encajar.
  5. Save the UV como XML.

formato Targa

¿Quieres usar una paleta? Debido a que su hacer un juego, que se lo recomendaría a calcular una gama de colores para sus mapas de bits y colocarla en la Targa para reducir el tamaño del archivo.

Oh, antes de que me olvide, .NET duerma uso RGBA, en cambio, los píxeles son BGRA. No me pregunte por qué, pero es como eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top