كيفية تمثيل وترميز الصور ومقاطع الفيديو في الحاسوب
كيف يفهم ويخزن الحاسوب الصور ومقاطع الفيديو
عندما نتحدث عن الصور أو الصوت وما شابه من أنواع الخرج (output)، فيجب دائمًا معرفة طريقة عمل جهاز الخرج حتى نعرف كيف يمكن تمثيل البيانات وفقًا لذلك. لذا يجب أن نتعرف سريعًا على الشاشات. ربما لاحظت سابقًا وأنت تشتري حاسوبك المحمول أو جوالك، أن أحد المواصفات الخاصة به هي دقة الشاشة، فقد يُكتب في المواصفات مثلا أن دقة الشاشة هي 1920 × 1080 فهل تعلم ما يعنيه ذلك؟ إنه يعني أن الشاشة تحوي عرضًا على 1920 بيكسل، وطولا على 1080 بيكسل، أي عدد البيكسلات الإجمالي في الشاشة يُحسب مثل حساب مساحة المستطيل، وهو الطول ضرب العرض:
1920 × 1080 = 2073600 pixels = 2073,6 megapixels
وهو العدد الإجمالي من البيكسلات التي تحويها الشاشة في تلك الحالة. ولكن ما معنى بيكسل؟
كلمة pixel هي اختصار لـ pictures element أي “عنصر من الصورة”، وهو أصغر عنصر (مربع) في الصورة. وكل صورة تتألف من مربعات صغيرة جدًا، وبإعطاء كل مربع قمية اللون الذي يجب أن يُظهره، تتشكل الصورة الكاملة.
يمكن توضيح ذلك بشكل مرئي لنا عبر أخذ كل خمسين بيكسل متجاور في مربع واعتبارهم بيكسل واحد، فينتج لنا الصورة التالية:
هل لاحظت المربعات بشكل واضح، أي أن الصورة تتألف من مربعات مجتمعة، بحيث يأخذ كل مربع لون واحد فقط لا غير. والآن لنضاعف الدقة عبر اعطاء كل 25 بيكسل في مربع لون واحد:
لاحظ كيف أن المربعات أصبحت أصغر. يأخذ في الصورة أعلاه كل 25 بيكسل نفس اللون ،وبتحسين الدقة بحيث يأخذ كل بيكسل حقيقي على الشاشة لون خاص به نحصل على الصورة التالية:
الصورة أعلاه بدقة 1920 × 1280، وقد لا تكون أفضل دقة يمكن أن تعرضها شاشتك، أي أن عدد البيكسلات في شاشتك قد يكون أكثر من ذلك. وفي تلك الحالة فما تزال شاشتك تعطي لعرض الصورة أعلاه نفس اللون لعدة بيكسلات متجاورة.
إذًا، لعرض الصور يجب تقسيمها لمربعات صغيرة، أي توزيعها على البيكسلات على الشاشة، وإعطاء كل بيكسل قيمة محددة. ولكن ما هي تلك القيمة؟ إنه اللون. ولكن كيف يتم تمثيل اللون؟ يوجد عدة طرق لتمثيل الألوان، من الطرق الشهيرة جدًا طريقة RGB أي أحمر أخضر أرزق، بهذا الترتيب، وهي الألوان الرئيسية التي يمكن تشكيل كل الألوان من خلالها، ويتم إعطاء كل لون قيمة من 0 إلى 255. حيث يمثل 0 انعدام اللون و 255 الكثافة الكاملة للون (intensity). اللون الأبيض مثلا يكون بمزج الألوان الثلاثة بالكامل أي تكون القيم 255-255-255. وهكذا باختلاف القيم الثلاث نحصل على تدرجات الألوان واللون المطلوب.
هل يمكنك تخمين قيمة اللون الأسود؟
إنه انعدام اللون..إنه 0-0-0.
ولكن لماذا لغاية 255؟
ليتسع ببايت واحد، وﻷنه كاف لتمثيل الألوان وتدرجاتها
يمكن الاطلاع على المثال البسيط التالي، حيث وُضع مربعات بالأحمر للدلالة على البيكسل والقيمة التي يحويها وفقًا لتمثيل RGB. علما أن البيكسل على الشاشة أصغر كثيًرا من المربعات الظاهرة، فالمربعات أدناه جعلناها كبيرة للتوضيح والتبسيط فقط:
كلما زاد عدد البيكسلات في الشاشة زادت الدقة التي يمكن أن تعطيها الشاشة.
لا يتم الاستفادة من كل البيكسلات في الشاشة (أي من دقة الشاشة الكاملة) إذا كانت الصورة لا تعطي قيمة لكل بيكسل على الشاشة (أي كانت الصورة أقل دقة من دقة الشاشة). يمكن معرفة دقة الصورة بواحدة البيكسل عبر برنامج مستعرض الصور في جهازك. وكذلك تُعرض أبعاد الصور في بحث جوجل عند التأشير على الصورة، حيث تظهر الأبعاد في الأسفل كما هو واضح في الصورة التالية:
أبعاد الصورة المختارة أعلاه هي 700 × 589 بيكسل، ودقة شاشة الجهاز لدي 1366 × 768 بيكسل، وبالتالي الصورة أقل دقة من دقة الشاشة التي يمكنها عرض صور أكثر دقة من هذه الصورة. أما هذه الصورة فعند وضعها بحجم الشاشة الكامل فسنرى بوضوح أن الدقة ضعيفة والرؤية والتفاصيل غير واضحة، حيث لا يتم إعطاء قيمة لكل بيكسل على الشاشة، وإنما تشترك كل مجموعة من البيكسلات المتجاورة بنفس القيمة، وبالتالي تقل الدقة وتصبح تفاصيل الصورة أقل وضوحًا.
وبنفس المنطق، إذا قمت بتحميل صورة أعلى دقة من دقة الشاشة، فهذا يعني أن الصورة تحمل قيمة لبيكسلات أكثر من عدد البيكسلات الموجود في الشاشة. وبالتالي ستضيع بعض تفاصيل الصورة بسبب قلة دقة الشاشة (وستكون بدورك نزلت بيانات إضافية لن تستفد منها، وبالتالي لا فائدة مثلا من تشغيل فيديو على اليوتيوب بدقة 4k إذا كانت شاشتك ليست بتلك الدقة، فذلك سيؤدي لتنزيل بيانات إضافية من الإنترنت دون أي فائدة).
لكي نلخص ما تعلمناه، يمكن أن نقول أن كل صورة يتم تمثيلها وحفظها في الحاسوب على أنها ثلاث مصفوفات عددية ثنائية الأبعاد (أي مصفوفة تتألف من أسطر وأعمدة)، ويكون عدد الأسطر والأعمدة بحسب دقة الصورة. في حالة الصورة الأخيرة، يكون لدينا ثلاثة مصفوفات مؤلفة من 700 عمود و 589 سطر. المصفوفة الأولى تحفظ قيم اللون الأحمر لكل بيكسل، حيث تتراوح كل قيمة كما ذكرنا من 0 إلى 255. والمصفوفة الثانية تحوي قيم اللون الأخضر والثالثة تحوي قيم اللون الأزرق. هذه هي الصورة في الحاسوب.
والآن..ماذا عن الفيديو؟ كيف يتم تمثيله؟
لا يوجد شيء جديد يمكن أن نتحدث عنه بالنسبة للمقاطع المتحركة، ﻷن المقطع المتحرك ما هو إلا عرض صور متتابعة بشكل سريع، تكون سرعة عرض الصور في مقاطع الفيديو عادةً 50 صورة في الثانية (ويسمى fps أي frame per second). وبالتالي الصورة هي المكون الرئيسي للفيديو، وقد علمنا ترميز الصور.
للاطلاع: يُظهر المقطع التالي لعبة GTA وهي تُلعب بعرض صورة واحدة في الثانية، ثم 5 صور في الثانية ثم عشرين ثم ثلاثين صورة في الثانية وهكذا..ولاحظ كيف أن إحساس الفيديو يبدأ من 20 صورة في الثانية: https://www.youtube.com/watch?v=ESLdzYs8Bj4
انتبه لشيء ما في المقطع أعلاه.. هل تعتقد أنك استطعت رؤية تجربة الـ 100 صورة في الثانية؟
طبعًا لا! انظر لإعدادات الدقة على اليوتيوب، ستجد أن الفيديو يُعرض لك بدقة 60 صورة في الثانية:
وبالتالي لايمكنك رؤية ماهو مكتوب على أنه 100 صورة في الثانية.
يلعب كلا كرت الشاشة والشاشة نفسها دورًا في تحديد أقصى عدد صور يمكنك أن تشاهده في الثانية. تحوي الشاشات خاصية تسمى معدل التحديث (refresh rate) وتُقاس بالهيرتز. الشاشة التي تملك معدل تحديث 60 هيرتز في الثانية تكون قادرة على عرض صور بسرعة حد أقصى 60 صورة في الثانية.
ولكن يبقى هنا سؤال مهم أخير، هل يتطلب عرض الصور عمليات حسابية؟ ﻷنني أعلم بوجود شيء يسمى “كرت الشاشة” (بالإنجليزية video card)، وأنني عند تشغيل لعبة ما، يمكن أن أحدد دقة العرض من الإعدادات، وبتحديد دقة عرض عالية فسترتفع درجة حرارة الجهاز وتدور المروحة بشكل سريع، فما الذي يجري حينها؟
الصور نوعان رئيسيان، يوجد الصور المأخوذة بالكاميرا، والصور التصميمية مثل شعار الشركات والصور “الكرتونية”. تكون صيغ النوع الأول من الصور jpeg , png وغيرها، بينما يحمل النوع الثاني من الصور الصيغة svg وغيرها. يسمى النوع الأول من الصور raster images وهي صور بدقة ثابتة محددة بدقة الكاميرا التي تم التصوير من خلالها. ولا يتطلب عمومًا إجراء عمليات حسابية لعرضها على الشاشة، حيث تكون القيم محفوظة وجاهزة ولا تتطلب حسابات.
لحظة.. لنجعل الأمر أكثر وضوحًا هنا. الكلام أعلاه صحيح لغاية العبارة “لا تتطلب حسابات”..هي فعلا لا تتطلب حسابات ﻷن الصورة فعلا محفوظة بقيم كل بيكسل..ولكن دقة الشاشة قد تكون مختلفة عن دقة الصورة كما ذكرنا، وكذلك عند تكبير أو تصغير الصورة أو تدويرها مثلا، سيتطلب الأمر كرت شاشة (كرت الشاشة المدمج مع المعالج يكفي هنا، وليس كرت شاشة مستقل) لكي يغير العرض على الشاشة ويُعطي كل بيكسل على الشاشة القيمة المناسبة له عند تكبير وتصغير الصورة. ولكن الأمر هذا بسيط ولا يحتاج لحسابات كبيرة ولا يؤدي لارتفاع درجة حرارة الجهاز، فكرت الشاشة الذي يعرض مقطع فيديو مكون من 50 أو 60 صورة في الثانية وبسلاسة، يكون بالنسبة له تغيير العرض عند تغيير أبعاد الصورة أو التنقل من نافذة ﻷخرى على الحاسوب وما إلى ذلك أمور تافهة. وهنا يقوم كرت الشاشة بأخذ قيم البكسلات المحفوظة أصلا للصورة أو الفيديو (والتي لا تتطلب لحساب، فهي محفوظة) وإعطاء كل بيكسل على الشاشة قيمته المناسبة ليتناسب عرض الصورة بحسب أبعاد الشاشة. أما إذا تطلب الأمر حساب القيم، أي ليس لدينا صورة محفوظة بل نحن نريد إنشاء تلك الصورة، فعندها يتطلب حسابات كبيرة، كما في النوع الثاني من الصور. تابع معي.
أما النوع الثاني من الصور، فتكون مُعرّفة بحسب الأبعاد، ودقتها غير ثابتة، وتتميز بحجمها الصغير وبأن دقتها لا تقل مهما قمت بتكبير أبعادها.
ماذا قلت؟ وهل يوجد شيء كذلك؟
خذ هذه الصورة واضغط على أيقونة التحميل يسارًا، سيظهر لك خياري العرض على المتصفح والتنزيل لجهازك، اختر أيهما تشاء ثم قم بتكبير الصورة بالقدر الذي تشاء: https://en.wikipedia.org/wiki/SVG#/media/File:SVG_Logo.svg
يمكن صنع صور كهذه عبر البرنامج المجاني Inkscape.
وبما أن الدقة لا تتغير، فإن عرض تلك الصور على الشاشة يتطلب إجراء عمليات حسابية لمعرفة القيم التي يجب أن تأخذها البيكسلات على الشاشة بحسب الأبعاد المطلوبة وبحيث تبقى الدقة عالية.
يتم عرض الرسومات في الألعاب بحسب الدقة التي تحددها في الإعدادات، هذا من ناحية الأبعاد، وكذلك فإن عدد الصور المعروضة في الثانية متغير ويمكن أن يزيد لزيادة الدقة (50 صورة أو 60 صورة في الثانية أو ربما أكثر). ويتغير عرض الصور (المشهد) بشكل مباشر بحسب إدخال المستخدم، ففي مشهد ثلاثي الأبعاد في اللعبة مثلا، تقوم بنقل نظر اللاعب يمينا ويسارا وتذهب باللاعب لأماكن مختلفة، هنا وعند كل لحظة يجب حساب القيم الجديدة التي يجب أن تأخذها البيكسلات على الشاشة، وهذا يتطلب الكثير من العمليات الحسابية في الثانية، وذلك كي يتغير المشهد ويظهر لك المشهد الجديد مباشرة مع حركة الفأرة ودون أي تأخير. العملية هذه تسمى rendering وتتألف من عدة مراحل حتى تصل للمرحلة النهائية وهي تحديد قيم كل بيكسل ووصولها للشاشة. وتُعطى صفة real-time أي في الوقت الحقيقي، بسبب تغير المشهد مباشرة بحسب إدخالك.
لاحظ هنا أن المشاهد التي تراها في اللعبة لا تكون محفوظة على شكل صور، ولهذا السبب يتطلب الموضوع إنشاء صور أثناء اللعب وبالتالي إجراء حسابات كثيرة جدًا، ﻷن الصور التي يمكن أن تَنتج وأنت تلعب لا نهائية أساسًا، فاللاعب يمكن أن يكون في أي مكان في الفضاء المعطى، وكذلك الخصم أو الخصوم، بالإضافة للعناصر الأخرى في اللعبة. ولهذا يتطلب حساب المخرجات بحسب المدخلات وإنشاء وتوليد صور جديدة في كل ثانية.
ولكن ما علاقة كرت الشاشة بالعمليات الحسابية؟ أليس المسؤول عن العمليات الحسابية هو المعالج (CPU)؟
يمكن لكرت الشاشة أيضًا إجراء العمليات الحسابية، وهذا هو دوره الأساسي، ولكنه مخصص للعمليات الحسابية الخاصة بالعرض، لذا فهو أسرع في هذه المهام وأبطئ من المعالج في المهام الأخرى. سندرس تفاصيل أكثر عن المعالج وكرت الشاشة قريبًا إن شاء الله.