Question

J'écris un outil pour automatiser certaines de nos prises d'actifs pour un jeu. Ce que je veux faire est de prendre un dossier de fichiers PNG, les combiner dans un atlas de texture, puis exporter l'atlas comme TGA et les coords UV au format XML.

Je ne suis pas sûr de la méthode que je devrais utiliser pour charger les fichiers PNG en C #, car il semble y avoir plusieurs. Quelle est la méthode recommandée pour charger des images en C # qui donne accès aux données de couleur / alpha afin que je puisse l'extraire à la TGA?

J'ai aussi déjà TGA code de création en C ++ que je prévois de passer à C #, mais je me demande s'il y a quelque chose déjà disponible en .Net pour créer / enregistrer TGAs?

Merci pour la lecture.

Était-ce utile?

La solution

Charger un fichier PNG dans un .Net Bitmap est facile:

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

Une fois que vous avez le Bitmap chargé, vous pouvez accéder à toutes ses informations (y compris les informations de canal alpha) plus efficacement en utilisant la méthode LockBits du Bitmap (il y a sur StackOverflow de nombreux exemples de code LockBits).

Mise à jour : voici un exemple de code qui montre comment utiliser LockBits pour accéder au pixel par pixel des données de Bitmap:

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

Vous devez définir l'option du compilateur « Autoriser code non sécurisé » pour votre projet d'utiliser ce code. Vous pouvez également utiliser la méthode de la Bitmap, mais cela est incroyablement lent GetPixel (x, y).

Autres conseils

Je n'ai pas un exemple de code, mais je peux vous donner une ligne directrice

  1. Charger PNG en utilisant Image.FromFile (). .NET prend en charge le chargement PNG
  2. Ouvrez un descripteur de fichier à votre targa. Créer un XmlDocument. soutien ne marche pas .NET targa, vous devez écrire manuellement.
  3. Verrouiller le bitmap pour obtenir les pixels. GetPixel () est très lent. Je pense que la méthode est nommé LockBits (). Vous obtenez un pointeur vers la surface pour lire les pixels
  4. Ecrire à targa. Targa est un format de conteneur, de sorte que toute bitmap doit correspondre.
  5. Save the UV Xml.

le format Targa

Voulez-vous utiliser une palette? Depuis votre création d'un jeu, je vous recommande de calculer une palette pour vos bitmaps et mettez-le dans targa pour réduire la taille du fichier.

Oh, avant de l'oublier, l'utilisation ne marche pas .NET RGBA, au contraire, les pixels sont BGRA. Ne me demandez pas pourquoi, mais son comme ça.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top