سؤال

سؤال C # (.net 3.5).لدي فئة، ImageData، تحتوي على حقل ushort[,] بكسل.أنا أتعامل مع تنسيقات الصور الخاصة.تأخذ فئة ImageData موقع الملف في المُنشئ، ثم تقوم بتشغيل امتداد الملف لتحديد كيفية فك التشفير.يوجد في العديد من ملفات الصور حقل "عمق البت" في الرأس.بعد أن قمت بفك تشفير الرأس، قرأت قيم البكسل في مصفوفة "البكسل".حتى الآن لم يكن لدي أكثر من 16bpp، لذلك أنا بخير.ولكن ماذا لو كان لدي 32bpp؟

ما أريد القيام به هو تحديد نوع البكسل في وقت التشغيل.أريد أن أفعل ذلك بعد أن أقرأ عمق البت من الرأس وقبل أن أنسخ بيانات البكسل إلى الذاكرة.أيه أفكار؟

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

المحلول

لتبسيط مشكلتك، تريد أن تكون قادرًا على الحصول على فصل دراسي يحتوي على قصيرة [،] بكسل المجال (16 بت لكل بكسل) في بعض الأحيان و uint32[،] بكسل الحقل (32 بت لكل بكسل) في بعض الأحيان الأخرى.هناك طريقتان مختلفتان لتحقيق ذلك.

يمكنك إنشاء بدائل لـ ushort / uint32 عن طريق إنشاء فئة Pixel بفئات فرعية 32 بت و16 بت، متجاوزة العديد من المشغلين في wazoo، لكن هذا يتطلب الكثير من النفقات العامة، ومن الصعب الحصول عليه بشكل صحيح وأكثر صعوبة في تحديده إذا كان حقه.بدلاً من ذلك، يمكنك إنشاء فئات وكيل لبيانات البكسل الخاصة بك (والتي قد تحتوي على صفائف ushort[,] أو uint32[,] وستحتوي على جميع أدوات الوصول الضرورية لتكون مفيدة).الجانب السلبي هو أنه من المحتمل أن ينتهي بك الأمر مع الكثير من رموز الحالة الخاصة في فئة ImageData والتي يتم تنفيذها بطريقة أو بأخرى اعتمادًا على بعض علامات الوضع 16 بت/32 بت.

أعتقد أن الحل الأفضل هو تقسيم ImageData إلى فئات 16 بت و32 بت، واستخدام طريقة المصنع لإنشاء المثيلات.على سبيل المثالImageData هي الفئة الأساسية، وImageData16bpp وImageData32bpp عبارة عن فئات فرعية، والطريقة الثابتة ImageData.Create(string imageFilename) هي طريقة المصنع التي تنشئ إما ImageData16bpp أو ImageData32bpp اعتمادًا على بيانات الرأس.على سبيل المثال:

public static ImageData Create(string imageFilename)
{
   // ...
   ImageDataHeader imageHeader = ParseHeader(imageFilename);
   ImageData newImageData;
   if (imageHeader.bpp == 32)
   {
      newImageData = new ImageData32(imageFilename, imageHeader);
   }
   else
   {
      newImageData = new ImageData16(imageFilename, imageHeader);
   }
   // ...
   return newImageData;
}

نصائح أخرى

أود أن أقول عدم القيام بهذا العمل في المنشئ - لا ينبغي للمنشئ أن يقوم بالكثير من العمل، في رأيي.استخدم أسلوب المصنع الذي يقرأ الملف لتحديد عمق البت، ثم اطلب منه إنشاء المتغير العام الصحيح للفئة وإعادته.

اطلب من وظيفة فك التشفير الخاصة بك إرجاع كائن من النوع Array، وهو الفئة الأساسية لجميع المصفوفات.ثم يمكن للأشخاص الذين يهتمون بالنوع القيام بـ "if (a is ushort[,])" وما إلى ذلك إذا كانوا يريدون المرور عبر وحدات البكسل.إذا قمت بذلك بهذه الطريقة، فستحتاج إلى تخصيص المصفوفة في ImageData، وليس العكس.

وبدلاً من ذلك، من المحتمل أن يعرف المتصل نوع مصفوفة البكسل هم أريدك أن تستخدم.حتى لو كانت صورة بدقة 8 بت في الثانية أو 16 بت في الثانية، إذا كنت تقوم بفك ترميزها إلى شاشة بدقة 32 بت في الثانية، فستحتاج إلى استخدام uint بدلاً من ushort.لذلك يمكنك كتابة دالة ImageData التي سيتم فك تشفيرها إلى أعداد صحيحة من أي نوع T.

أصل مشكلتك هو أنك لا تعرف كيفية تحديد نوع تنسيق الإخراج الذي تريده.تحتاج إلى معرفة ذلك أولاً، ويأتي بناء جملة البرنامج في المرتبة الثانية.

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