سؤال

انا اقرأ هذا البرنامج التعليمي عند الحصول على بيانات البكسل من كاميرا iPhone.

على الرغم من أنه ليس لدي أي مشكلة في تشغيل هذا الرمز واستخدامه، إلا أنني أحتاج إلى إخراج بيانات الكاميرا (التي تأتي في BGRA) وتحويلها إلى ARGB حتى أتمكن من استخدامها مع مكتبة خارجية.كيف أقوم بهذا العمل؟

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

المحلول

إذا كنت تستخدم نظام التشغيل iOS 5.0، فيمكنك استخدام vImage ضمن إطار عمل Accelerate لإجراء تبديل لمكونات الألوان المُحسّنة باستخدام NEON باستخدام تعليمات برمجية مثل ما يلي (مأخوذة من Apple's كود مصدر WebCore):

vImage_Buffer src;
src.height = height;
src.width = width;
src.rowBytes = srcBytesPerRow;
src.data = srcRows;

vImage_Buffer dest;
dest.height = height;
dest.width = width;
dest.rowBytes = destBytesPerRow;
dest.data = destRows;

// Swap pixel channels from BGRA to RGBA.
const uint8_t map[4] = { 2, 1, 0, 3 };
vImagePermuteChannels_ARGB8888(&src, &dest, map, kvImageNoFlags);

أين width, height, ، و srcBytesPerRow يتم الحصول عليها من المخزن المؤقت للبكسل الخاص بك عبر CVPixelBufferGetWidth(), CVPixelBufferGetHeight(), ، و CVPixelBufferGetBytesPerRow(). srcRows سيكون المؤشر إلى العنوان الأساسي للبايتات في المخزن المؤقت للبكسل، و destRows ستكون الذاكرة التي خصصتها للاحتفاظ بصورة RGBA الناتجة.

يجب أن يكون هذا أسرع بكثير من مجرد تكرار البايتات وتبديل مكونات الألوان.

اعتمادًا على حجم الصورة، سيكون الحل الأسرع هو تحميل الإطار إلى OpenGL ES، وتقديم مستطيل بسيط باستخدام هذا كنسيج، واستخدام glReadPixels() لسحب قيم RGBA للأسفل.والأفضل من ذلك هو استخدام ذاكرة التخزين المؤقت للنسيج لنظام التشغيل iOS 5.0 لكل من التحميل والتنزيل، حيث تستغرق هذه العملية من 1 إلى 3 مللي ثانية فقط لإطار بدقة 720 بكسل على جهاز iPhone 4.وبطبيعة الحال، فإن استخدام OpenGL ES يعني الكثير من التعليمات البرمجية الداعمة لتحقيق ذلك.

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