كيفية تحميل PNGS والتصدير إلى TGA حفظ ألفا في C #؟

StackOverflow https://stackoverflow.com/questions/1514846

  •  19-09-2019
  •  | 
  •  

سؤال

أنا أكتب أداة لأتمتة بعض صنع الأصول لدينا للحصول على لعبة. ما أريد القيام به هو تناول مجلد من ملفات PNG، ودمجها في Atlas الملمس ثم قم بتصدير ATLAS ك TGA واينامس الأشعة فوق البنفسجية إلى XML.

لست متأكدا من الطريقة التي يجب استخدامها لتحميل ملفات PNG في C # كما يبدو أن هناك عدة. ما هي الطريقة الموصى بها لتحميل الصور في C # التي تمنح الوصول إلى بيانات اللون / Alpha حتى أتمكن من استخراجها إلى TGA؟

لدي بالفعل رمز إنشاء TGA في C ++ الذي أخطط للانتقال إلى C # لكنني أتساءل عما إذا كان هناك أي شيء متوفر بالفعل في .NET لإنشاء / حفظ TGAS؟

شكرا للقراءة.

هل كانت مفيدة؟

المحلول

تحميل ملف PNG في صورة نقطية .NET سهل:

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

بمجرد تحميل الصورة النقطية، يمكنك الوصول إلى جميع معلوماتها (بما في ذلك معلومات قناة Alpha) بشكل أكثر كفاءة باستخدام طريقة Lockbits's Bitmap (هناك العديد من عينات رمز Lockbits على Stackoverflow).

تحديث: إليك نموذج التعليمات البرمجية الذي يوضح كيفية استخدام Lockbits للوصول إلى بيانات Pixel-by-by-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);

تحتاج إلى تعيين خيار مترجم "السماح رمز غير آمنة" لمشروعك لاستخدام هذا الرمز. يمكنك أيضا استخدام طريقة GetPixel (x، y) من الصورة النقطية، ولكن هذا بطيء بشكل مثير للدهشة.

نصائح أخرى

ليس لدي عينة من التعليمات البرمجية، لكن يمكنني أن أعطيك مبادئ توجيهية

  1. تحميل PNG باستخدام Image.FromFile (). .NET يدعم تحميل PNG
  2. افتح مقبض ملف Targa الخاص بك. إنشاء XMLDocument. .NET لا يدعم Targa، لذلك عليك كتابة ذلك يدويا.
  3. قفل الصورة النقطية للحصول على بكسل. getpixel () بطيئة جدا. أعتقد أن الطريقة هي المسمى Lockbits (). تحصل على مؤشر إلى السطح لقراءة البكسل
  4. اكتب إلى targa. Targa هو تنسيق حاوية، لذلك يجب أن يصل أي صورة نقطية.
  5. احفظ الأشعة فوق البنفسجية مثل XML.

تنسيق targa

هل تريد استخدام لوحة؟ نظرا لأن صنع لعبة، أود أن أوصي بحساب لوحة من الصور النقطية ووضعها في Targa لتقليل حجم الملف.

أوه، قبل أن أنسى، .NET لا يستخدم RGBA، بدلا من ذلك، البكسلات هي BGRA. لا تسألني لماذا، ولكن هكذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top