سؤال

أحاول تحويل صورة RGB إلى صورة Argb، أساسا إضافة 255 في قناة ألفا. كنت أتساءل عما إذا كانت هناك طريقة حزمة للقيام بذلك دون التكرار؟ لذلك للتكرار فوق بيانات RGB الخاصة بي وإلحاق 255 لكل بكسل.

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

المحلول

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

void setAlpha(unsigned char *rgba, int width, int height, int alpha)
{
  int x, y;

  for(y = 0; y < height; y++)
  {
    for(x = 0; x < width; x++, rgba += 4)
    {
      rgba[3] = (unsigned char) alpha;
    }
  }
}

الافتراضات الأساسية:

  • ترتيب التعبئة هو RGBA في الذاكرة، أي الإزاحة 3 إلى البايت ألفا، من بداية البكسل.
  • يتم تخزين الصورة مع البكسل العلوي الأيسر في العنوان الأولي، في ترتيب اليمين إلى اليسار، من أعلى إلى أسفل.
  • لا يوجد حشوة أو أي شيء

لاحظ أيضا ترتيب الحلقات؛ هذا يمكن أن يحدث فرقا كبيرا للأداء العالمي الحقيقي بسبب التخزين المؤقت. يمس هذا الرمز بكسلات قريبة في الذاكرة بالتسلسل، وهو أمر جيد يسمى "محلية جيدة".

تغيير المؤشر إلى الإشارة إلى البكسل التالي بدلا من ذكر العنوان (rgba[4 * y * width + 4 * x + 3]) هو أيضا تحسين، و (لي) سهلة بما يكفي لفهم.

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