سؤال

لذلك، أنا مرتبك للغاية بسبب اختبار سريع واجهته للتو. أقوم ببعض معالجة الصور في C #. لقد أثبت الحصول على / SetPixel () بطيئا للغاية، لذلك أنا أستخدم Lockbits للحصول على البيانات الأولية.

ومع ذلك، يبدو أنني أصابت موقفا لا يمكنني معرفة ذلك. أثناء مسح الصورة، يبدو أن كل بكسل قد تم وضع كل بكسل مثل BGRA، أي بايت أزرق، بايت أخضر، بايت أحمر، ولفا، بهذا الترتيب. كنت تحت الانطباع بأنه سيتم وضعها في أمر الأرج. هنا عينة من التعليمات البرمجية التي أستخدمها.

BitmapData baseData =
    m_baseImage.LockBits(new Rectangle(new Point(0, 0), m_baseImage.Size), 
        ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
Bitmap test = new Bitmap(m_baseImage.Width, m_baseImage.Height);           

byte* ptr = (byte*)baseData.Scan0;
for (int y = 0; y < m_baseImage.Height; ++y)
{                              
    for (int x = 0; x < m_baseImage.Width; ++x)
    {
        // this works, image is copied correctly
        Color c1 = Color.FromArgb(*(ptr + 3), *(ptr + 2), *(ptr + 1), *ptr);
        // below does not work!  Bytes are reversed.
        //Color c1 = Color.FromArgb(*ptr, *(ptr + 1), *(ptr + 2), *(ptr + 3));

        test.SetPixel(x, y, c1);
        ptr += 4;
    }             
}

m_baseImage.UnlockBits(baseData);
pictureBox1.Image = m_baseImage;
pictureBox2.Image = test;

الخط الأول الذي يمسك لون أعمال الصورة الأساسية، والثاني لا. أنا متأكد من أنني أفتقد شيئا واضحا جدا هنا.

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

المحلول

ليس فقط الألوان التي عكسها BGRA، ولكن يتم عكس الصفوف أيضا - الجزء السفلي من الصورة هو الأول في الذاكرة. إنها الطريقة التي يعمل بها Windows دائما.

يبدو تفسير نبيذ صغير واضحا، لكنني لا أعتقد أنها الحقيقة. إذا نظرت إلى تعريف colorref في واجهة برمجة التطبيقات, ستلاحظ أن اللون الأحمر هو بايت الترتيب المنخفض والأزرق هو الترتيب الأعلى؛ إذا قمت بتخزين هذا كقيمة عدد صحيح واحد، فسيكون RGB0.

نصائح أخرى

يشير Argb إلى ترتيب البايت بكلمات جلبت ككلمات. إذا قمت بإعادة جلب البايتات واحدا في كل مرة، فسوف تتلقى em منخفضة إلى مرحبا باسم IBM PC قليلا النصر

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