مواصفات حاوية WebP

مقدمة

وWebP هو تنسيق صورة يستخدم إما (i) ترميز الإطار الرئيسي VP8 ضغط بيانات الصور مع فقدان البيانات أو (2) تشفير WebP بدون فقدان البيانات. هذه على زيادة فعاليتها من التنسيقات القديمة، مثل JPEG، وGIF وPNG. وهي محسَّنة لنقل الصور بسرعة عبر الشبكة (إذا كانت على سبيل المثال، بالنسبة إلى مواقع الويب). يتضمّن تنسيق WebP ميزات متطابقة مع التنسيقات الأخرى (ملف تعريف الألوان والبيانات الوصفية والصور المتحركة وما إلى ذلك). يصف هذا المستند بنية ملف WebP.

تسمح حاوية WebP (أي حاوية RIFF لـ WebP) بدعم الميزات أو أعلى من حالة الاستخدام الأساسية لـ WebP (أي ملف يحتوي على مرمّزة كإطار رئيسي VP8). توفّر حاوية WebP معلومات إضافية عن ما يلي:

  • الضغط بدون فقدان البيانات: يمكن ضغط صورة بدون فقدان بيانات، وذلك باستخدام تنسيق WebP بدون فقدان البيانات

  • البيانات الوصفية: قد تحتوي الصورة على بيانات وصفية مخزَّنة في ملف صور قابل للتبادل. تنسيق (Exif) أو النظام الأساسي للبيانات الوصفية الموسعة (XMP)

  • الشفافية: يجب أن تكون الصورة شفافة، أي قناة ألفا.

  • ملف تعريف الألوان: قد تحتوي الصورة على ملف تعريف ICC مضمّن كما هو موضح من قِبل اتحاد الألوان الدولي.

  • الصورة المتحركة: قد تحتوي الصورة على عدة لقطات مع فواصل بينها، مما يجعلها صورة متحركة.

التسمية

يُنصح باستخدام الأنواع التالية عند الإشارة إلى حاوية WebP :

اسم تنسيق الحاويةتنسيق WebP
امتداد اسم الملف.webp
MIME-typeصورة/webp
معرّف النوع الموحّدorg.webmproject.webp

المصطلحات والأساسيات

يجب تفسير الكلمات الرئيسية "يجب" و"يجب ألّا" و"مطلوب" و"يجب أن" و"يجب ألّا" و"يجب" و"يجب ألّا" و"مُستحسَن" و"غير مُستحسَن" و"يجوز" و"اختياري" في هذا المستند على النحو الموضّح في BCP 14 RFC 2119 RFC 8174 فقط عندما تظهر بأحرف كبيرة، كما هو موضّح هنا.

يحتوي ملف WebP على صورة ثابتة (أي مصفوفة مُشفَّرة من وحدات البكسل) أو صورة متحركة. يمكن أن يحتوي أيضًا على الشفافية ومعلومات ملف تعريف ألوان وبيانات وصفية. نشير إلى مصفوفة وحدات البكسل باسم لوحة الرسم الصورة.

يبدأ ترقيم وحدات البت في الرسوم البيانية الجماعية من 0 للبت الأكثر أهمية ('MSB 0')، كما هو موضح في RFC 1166.

في ما يلي مصطلحات إضافية مستخدَمة في هذا المستند:

قارئ/كاتب
يُشار إلى الرمز الذي يقرأ ملفات WebP باسم قارئ، في حين تتم الإشارة إلى الرمز الذي كاتبة يُشار إليها باسم كاتب.
uint16
عدد صحيح غير موقَّت بسعة 16 بت بترتيب البتات الأقل أهمية أولاً
uint24
عدد صحيح غير موقَّت بسعة 24 بت بترتيب الوحدات الأقل أهمية أولاً
uint32
عدد صحيح غير موقَّع بنظام النهاية 32 بت.
FourCC
الرمز المكون من أربعة أحرف (FourCC) هو uint32 الذي يتم إنشاؤه من خلال تسلسل أربعة أحرف ASCII بترتيب صغير. وهذا يعني أنّه يتم التعامل مع aaaa (0x61616161) وAAAA (0x41414141) على أنّهما معرّفات FourCC مختلفة.
الأرقام البدء من 1
على سبيل المثال، إذا كان الحقل يحتوي على عدد صحيح غير موقَّت يخزِّن القيم التي تم تعويضها بمقدار -1، سيخزِّن الحقل القيمة 25 على أنّها 24.
ChunkHeader('ABCD')
يُستخدَم لوصف عنوان FourCC وحجم الجزء للأجزاء الفردية، حيث يكون "ABCD" هو رمز FourCC للجزء. حجم هذا العنصر هو 8 بايت.

تنسيق ملف RIFF

يستند تنسيق ملف WebP إلى تنسيق المستند RIFF (تنسيق ملف تبادل الموارد).

العنصر الأساسي لملف RIFF هو القطعة. ويتألف من:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                         Chunk FourCC                          |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Chunk Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         Chunk Payload                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
جزء FourCC: 32 بت
رمز ASCII المكوّن من أربعة أحرف والذي يُستخدَم لتحديد المقطع
حجم مجموعة البيانات: 32 بت (uint32)
حجم الجزء بالبايت، باستثناء هذا الحقل أو معرّف الجزء أو المحتوى المُضاف
حمولة الجزء: حجم الجزء بايت
حمولة البيانات: إذا كان حجم القطعة فرديًا، تتم إضافة بايتة واحدة للملء، ويجب أن تكون0 للتوافق مع RIFF.

ملاحظة: لدى RIFF اصطلاح مفاده أن مقاطع FourCCs التي تتضمن أحرفًا كبيرة بالكامل هي قياسية التي تنطبق على أي تنسيق ملف RIFF، في حين أن FourCCs خاصة بملف التنسيق كلها بأحرف صغيرة. لا يتّبع تنسيق WebP هذا الاصطلاح.

عنوان ملف WebP

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'R'      |      'I'      |      'F'      |      'F'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                           File Size                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|      'W'      |      'E'      |      'B'      |      'P'      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
‫"RIFF": 32 بت
أحرف ASCII هي "R" و"I" و"F" و"F".
حجم الملف: 32 بت (uint32)
حجم الملف بالبايت، بدءًا من الإزاحة 8 القيمة القصوى هذا الحقل هو 2^32 مطروحًا منه 10 بايت وبالتالي يكون حجم الملف بالكامل معظم 4 غيبي بايت ناقص 2 بايت.
‫'WEBP': 32 بت
أحرف ASCII ‎'W' و‎'E' و‎'B' و‎'P'

يجب أن يبدأ ملف WebP برأس RIFF بـ FourCC "WEBP". حجم الملف في العنوان هو الحجم الإجمالي للأجزاء التي تتبعها بالإضافة إلى 4 بايت تنسيق WebP FourCC. يجب ألا يحتوي الملف على أي بيانات بعد البيانات المحددة بواسطة حجم الملف. قد يحلّل القرّاء هذه الملفات متجاهلين الخطوات اللاحقة. البيانات. بما أنّ حجم أيّ قطعة يكون زوجيًا، يكون الحجم الذي يقدّمه رأس RIFF زوجيًا أيضًا. يتم وصف محتوى المجموعات الفردية على النحو التالي الأقسام.

تنسيق ملف بسيط (بفقدان الجودة)

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

تنسيق ملف WebP (فقدان البيانات) البسيط:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        'VP8 ' Chunk                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

قطعة ‎"VP8":

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8 ')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           VP8 data                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
بيانات VP8: حجم الجزء بايت
بيانات بث البتات في VP8

لاحظ أن الحرف الرابع في 'VP8' FourCC عبارة عن مسافة ASCII (0x20).

يتم وصف مواصفات تنسيق بث البيانات البتية لـ VP8 في VP8 Data Format دليل فك الترميز يُرجى العِلم أنّ رأس إطار VP8 يحتوي على إطار VP8. العرض والارتفاع. يُفترض أن يكون ذلك هو عرض اللوحة وارتفاعها.

تصف مواصفات VP8 كيفية فك ترميز الصورة إلى تنسيق Y'CbCr. ولتتم عملية التحويل إلى RGB، يجب استخدام الاقتراح BT.601. مايو استخدام طريقة تحويل أخرى، ولكن قد تختلف النتائج المرئية بين برامج فك الترميز.

تنسيق ملف بسيط (بدون فقدان البيانات)

ملاحظة: قد لا تتوافق قارئ الكتب القديمة مع الملفات التي تستخدم تنسيقًا بدون فقدان البيانات.

يجب استخدام هذا التنسيق إذا كانت الصورة تتطلب ترميزًا بدون فقدان البيانات (مع قناة شفافية اختيارية) ولا تتطلب ميزات متقدّمة. باستخدام التنسيق الموسّع

تنسيق ملف WebP البسيط (بدون فقدان البيانات):

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                    WebP file header (12 bytes)                |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         'VP8L' Chunk                          :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

"VP8L" مجموعة:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8L')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                           VP8L data                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
بيانات VP8L: حجم القطع بايت
بيانات بث البتات VP8L

يمكن العثور على المواصفات الحالية لبث البتات VP8L على الرابط تنسيق بث البتات بدون فقدان في WebP. يُرجى العِلم أنّ رأس VP8L يحتوي على عرض وارتفاع صورة VP8L. ويُفترض أنّ هذا هو عرض وارتفاع اللوحة.

تنسيق الملف الموسّع

ملاحظة: قد لا تتوافق قارئات الكتب القديمة مع الملفات التي تستخدم التنسيق الموسّع.

يتألف الملف ذو التنسيق الموسّع من:

  • و"VP8X" مجموعة مؤلفة من معلومات عن الميزات المستخدمة في الملف

  • يكون حقل "ICCP" اختياريًا قطعة باستخدام ملف تعريف الألوان

  • صورة "ANIM" اختيارية مجموعة بيانات التحكّم في الصور المتحركة

  • بيانات الصورة

  • قطعة اختيارية من بيانات EXIF تتضمّن بيانات EXIF الوصفية

  • مجموعة اختيارية من بيانات XMP تتضمّن البيانات الوصفية لتنسيق XMP

  • قائمة اختيارية بالأجزاء غير المعروفة

بالنسبة إلى الصورة الثابتة، تتألّف بيانات الصورة من إطار واحد، وهو يتألّف بدوره من:

بالنسبة إلى الصورة المتحركة، تتألّف بيانات الصورة من لقطات متعددة. يمكنك الاطّلاع على مزيد من التفاصيل حول اللقطات في قسم الحركة.

جميع المقاطع اللازمة لإعادة البناء وتصحيح الألوان، مثل "VP8X"، "ICCP" و"ANIM" و"ANMF" و"ALPH" و"VP8" و"VP8L"، يجب أن يظهرا في الترتيب التي وصفناها سابقًا. من المفترض أن يتعذّر على برامج القراءة قراءة الملفات عندما تكون الأجزاء اللازمة لإعادة الإنشاء وتصحيح الألوان غير مرتبة.

قد تظهر البيانات الوصفية والقطع غير المعروفة خارج الترتيب.

الأسباب: يجب أن تظهر الأجزاء اللازمة لإعادة البناء أولاً في الملف للسماح للقارئ بالبدء في فك ترميز صورة قبل استلام جميع البيانات. قد يستفيد التطبيق من تغيير ترتيب البيانات الوصفية والمقاطع المخصّصة بما يناسب عملية التنفيذ.

عنوان ملف WebP الموسّع:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|                   WebP file header (12 bytes)                 |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('VP8X')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv|I|L|E|X|A|R|                   Reserved                    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Canvas Width Minus One               |             ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...  Canvas Height Minus One    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
محجوزة (Rsv): 2 بت
يجب أن يكون 0. على القرّاء تجاهل هذا الحقل.
ملف ICC (I): بت واحد
اضبط هذا الخيار إذا كان الملف يحتوي على قطعة ICCP.
ألفا (L): بت واحد
حدِّد ما إذا كان أي من إطارات الصورة يحتوي على معلومات الشفافية. ("ألفا").
بيانات Exif الوصفية (E): بت واحد
حدِّد ما إذا كان الملف يحتوي على بيانات Exif الوصفية.
البيانات الوصفية بتنسيق XMP (X): 1 بت
يمكنك ضبط ما إذا كان الملف يتضمّن بيانات XMP الوصفية.
الرسوم المتحركة (أ): 1 بت
حدِّد ما إذا كانت هذه صورة متحركة. البيانات في "ANIM" وANMF يجب أن تكون الأجزاء للتحكّم في الصورة المتحركة
محجوز (R): بت واحد
يجب أن يكون
0. على القرّاء تجاهل هذا الحقل.
محجوز: 24 بت
يجب أن يكون 0. يجب أن يتجاهل القرّاء هذا الحقل.
عرض اللوحة ناقص واحد: 24 بت
عرض واحد للوحة بالبكسل. يبلغ عرض اللوحة الفعلي 1 + Canvas Width Minus One.
ارتفاع اللوحة ناقص واحد: 24 بت
الارتفاع بالبكسل للّوحة، مع البدء من 1 يبلغ ارتفاع اللوحة الفعلي 1 + Canvas Height Minus One.

يجب ألا يزيد عدد منتجات عرض اللوحة وارتفاع اللوحة عن 2^32 - 1.

قد تضيف المواصفات المستقبلية المزيد من الحقول. يجب تجاهل الحقول غير المعروفة.

Animation

يتم التحكّم في الصورة المتحركة من خلال وحدات ANIM وANMF.

"ANIM" مجموعة:

بالنسبة إلى الصور المتحركة، يحتوي هذا المقطع على المعلَمات العامة الرسوم المتحركة.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ANIM')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Background Color                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|          Loop Count           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
لون الخلفية: 32 بت (uint32)
اللون التلقائي للوحة الرسم [أزرق، أخضر، أحمر، ألفا] ترتيب بايت. يمكن استخدام هذا اللون لملء المساحة غير المستخدَمة على اللوحة. حول الإطارات، وكذلك وحدات البكسل الشفافة في الإطار الأول. يتم استخدام لون الخلفية أيضًا عندما تكون طريقة التخلص هي 1.

ملاحظة:

  • قد يحتوي لون الخلفية على قيمة ألفا غير معتمة، حتى إذا كانت علامة الإصدار الأولي في "VP8X" تم إلغاء ضبط مجموعة البيانات.

  • يجب أن تتعامل تطبيقات المشاهدين مع قيمة لون الخلفية كاقتراح، وليس مطلوبًا منها استخدامها.

  • يتم محو اللوحة في بداية كل حلقة. ويمكن استخدام لون الخلفية للقيام بذلك.

عدد مرات التكرار: 16 بت (uint16)
عدد مرات تكرار الصورة المتحركة. وإذا كانت 0، يعني ذلك. إلى ما لا نهاية.

يجب أن يظهر هذا المقطع إذا كانت علامة Animation في الفيديو "VP8X" تم ضبط مجموعة البيانات. إذا لم يتم ضبط العلامة Animation وكان هذا المقطع متوفّرًا، يجب تجاهله.

"ANMF" مجموعة:

بالنسبة إلى الصور المتحركة، يحتوي هذا المقطع على معلومات حول إطار واحد. إذا لم يتم ضبط علامة Animation، يجب ألا يكون هذا المقطع متوفّرًا.

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ANMF')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                        Frame X                |             ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...          Frame Y            |   Frame Width Minus One     ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
...             |           Frame Height Minus One              |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                 Frame Duration                |  Reserved |B|D|
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                         Frame Data                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
الإطار X: 24 بت (uint24)
الإحداثي X للزاوية اليسرى العليا للإطار هو Frame X * 2.
الإطار Y: 24 بت (uint24)
الإحداثي Y للزاوية العلوية اليسرى من الإطار هو Frame Y * 2.
عرض الإطار ناقص واحد: 24 بت (uint24)
عرض الإطار استنادًا إلى 1. عرض الإطار هو 1 + Frame Width Minus One.
ارتفاع اللقطة ناقص واحد: 24 بت (uint24)
ارتفاع الإطار بالاستناد إلى 1 ارتفاع الإطار هو 1 + Frame Height Minus One.
مدة اللقطة: 24 بت (uint24)
الوقت المطلوب للانتظار قبل عرض الإطار التالي، بوحدات تبلغ 1 مللي ثانية. يُرجى العِلم أنّ تفسير مدة اللقطة التي تساوي 0 (وغالبًا ما تكون <= 10) يتم تحديده من خلال التنفيذ. تحدد العديد من الأدوات والمتصفّحات الحدّ الأدنى للمدة الزمنية، وهو مشابه لفترة عرض ملفات GIF.
محجوز: 6 بت
يجب أن يكون
0. يجب أن يتجاهل القرّاء هذا الحقل.
طريقة المزج (B): 1 بت

يشير إلى كيفية دمج وحدات البكسل الشفافة في الإطار الحالي مع وحدات البكسل المقابلة في اللوحة السابقة:

  • 0: استخدِم دمج ألفا. بعد التخلص من الإطار السابق، يمكنك عرض الإطار الحالي على لوحة الرسم باستخدام مزج ألفا (انظر أدناه). إذا كان الإطار الحالي لا يتضمّن قناة شفافية، افترض أنّ قيمة الشفافية هي 255، ما يؤدي إلى استبدال المستطيل بشكل فعّال.

  • 1: يُرجى عدم المزج. بعد التخلص من الإطار السابق، يمكنك عرض الإطار الحالي على لوحة الرسم عن طريق استبدال المستطيل المغطى الإطار الحالي.

طريقة التخلص من المنتج (D): بت واحد

يشير إلى كيفية التعامل مع الإطار الحالي بعد معالجته. المعروضة (قبل عرض الإطار التالي) على اللوحة:

  • 0: لا تتخلص من الجهاز. اترك لوحة الرسم كما هي.

  • 1: التخلص من لون الخلفية ملء المستطيل على لوحة الرسم الذي يغطيه الإطار الحالي بلون الخلفية المحدد في "ANIM" كتلة

ملاحظات:

  • لا يتم التخلص من الإطار إلا على مستطيل الإطار، أي مستطيل تم تحديده بواسطة الإطار X والإطار Y وعرض الإطار والإطار الارتفاع. وقد يغطّي أو لا يغطّي اللوحة بأكملها.

  • دمج قيمة ألفا:

    بما أنّ كل قناة من قنوات R وG وB وA تبلغ 8 بت، ولا يتمّ مضاعفة قنوات RGB بالألفا، تكون صيغة دمج "dst" مع "src" هي:

    blend.A = src.A + dst.A * (1 - src.A / 255)
    if blend.A = 0 then
      blend.RGB = 0
    else
      blend.RGB =
          (src.RGB * src.A +
           dst.RGB * dst.A * (1 - src.A / 255)) / blend.A
    
  • ينبغي إجراء مزج ألفا في مساحة لون خطية، مع الأخذ في الاعتبار الملف الشخصي للألوان للصورة. إذا لم يكن ملف تعريف الألوان متوفّرًا، سيتم افتراض استخدام نموذج RGB العادي (sRGB). (يُرجى العِلم أنّه يجب أيضًا تسويت sRGB بسبب قيمة جاما التي تبلغ 2.2 تقريبًا).

بيانات اللقطة: حجم الجزء بايت - 16

تتألّف من:

ملاحظة: تتألف حمولة ANMF، وهي بيانات اللقطة، من أجزاء individual معبأة، كما هو موضّح في تنسيق ملف RIFF.

إصدار أولي

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ALPH')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Rsv| P | F | C |     Alpha Bitstream...                        |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
محجوزة (Rsv): 2 بت
يجب أن يكون
0. يجب أن يتجاهل القرّاء هذا الحقل.
المعالجة المُسبَقة (P): 2 بت

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

  • 0: ما مِن معالجة مسبقة.
  • 1: خفض المستوى

ولا يُطلب من برامج فك التشفير استخدام هذه المعلومات بأي طريقة محدّدة.

طريقة الفلترة (F): 2 بت

في ما يلي وصف لطرق الفلترة المستخدَمة:

  • 0: لا شيء.
  • 1: فلتر أفقي
  • 2: فلتر عمودي
  • 3: فلتر متدرج

لكل بكسل، يتم إجراء التصفية باستخدام العمليات الحسابية التالية. لنفترض أنّه تم تصنيف قيم ألفا المحيطة بالموضع الحالي X على النحو التالي:

 C | B |
---+---+
 A | X |

نحن نسعى إلى حساب قيمة ألفا في الموضع X. أولاً، التنبؤ هو اعتمادًا على طريقة التصفية:

  • الطريقة 0: المتنبئ = 0
  • الطريقة 1: المتنبّئ = أ
  • الطريقة 2: المتنبئ = B
  • الطريقة 3: المتنبئ = Clip(A + B - C)

حيث تكون clip(v) مساوية لـ:

  • 0 إذا كان v < 0،
  • 255 إذا كان v > 255 أو
  • v otherwise

يتم اشتقاق القيمة النهائية من خلال إضافة القيمة غير المضغوطة X إلى المتنبئ واستخدام حساب modulo-256 لحساب النطاق [256..511] إلى [0..255]:

alpha = (predictor + X) % 256

هناك حالات خاصة لمواضع البكسل في أقصى يمين الصورة وأقصى أعلاها. على سبيل المثال، تستخدم القيمة في أعلى يمين الموقع الجغرافي (0, 0) القيمة 0 كقيمة متوقّعة. غير ذلك:

  • بالنسبة إلى طرق الفلترة الأفقية أو المتدرجة، يتم توقّع وحدات البكسل على يمين الشاشة في الموقع (0، y) باستخدام الموقع (0، y-1) أعلاه مباشرةً.
  • بالنسبة إلى طرق التصفية الرأسية أو التدرجية، يتم وضع أقصى وحدات بكسل في يتم توقُّع الموقع الجغرافي (س، 0) باستخدام الموقع الجغرافي (س-1، 0) على اليسار.
طريقة الضغط (C): 2 بت

طريقة الضغط المستخدمة:

  • 0: بدون ضغط.
  • 1: تم ضغطها باستخدام تنسيق WebP بدون فقدان البيانات.
بث مباشر بألفا: حجم المجموعة بايت - 1

تدفّق بتات مُشفَّر للنص

يحتوي هذا المقطع الاختياري على بيانات ألفا مشفرة لهذا الإطار. إطار تحتوي على 'VP8L' يجب ألا تحتوي القطعة على هذا المقطع.

السبب: معلومات الشفافية هي جزء من ملف "VP8L" المجمّع.

يتم تخزين بيانات قناة الشفافية كبيانات أولية غير مضغوطة (عندما تكون طريقة الضغط هي "0") أو مضغوطة باستخدام التنسيق بدون فقدان الجودة (عندما تكون طريقة الضغط هي "1").

  • البيانات الأولية: تتكون من تسلسل بايت من الطول = العرض * الارتفاع، تحتوي على جميع قيم الشفافية ذات 8 بت بترتيب المسح.

  • ضغط التنسيق بدون فقدان البيانات: تسلسل البايت عبارة عن ملف مضغوط بث الصورة (كما هو موضّح في "تنسيق WebP Lossless Bitstream Format") للأبعاد الضمنية العرض × الارتفاع. أي أن هذا image-stream لا تحتوي على أي عناوين تصف أبعاد الصورة.

    السبب: السمات معروفة من مصادر أخرى، لذلك سيكون تخزينها مرة أخرى زائداً عن الحاجة وعرضة للخطأ.

    بعد فك ترميز بث الصور إلى قيم ملفّات ARGB (الأحمر والأخضر والأزرق والألفا)، وفقًا للعملية الموضّحة في مواصفات ملفّات ARGB غير المُفقدة، يجب استخراج معلومات الشفافية من قناة الأخضر في مجموعة ARGB الرباعية.

    الأسباب: يمكن للقناة الخضراء إجراء تحويل إضافي في المواصفات -- على عكس القنوات الأخرى -- التي يمكن أن لتحسين الضغط

Bitstream (VP8/VP8L)

يحتوي هذا الجزء على بيانات بث بت مضغوط لإطار واحد.

قد يكون مقطع البث النقطي إما (i) "VP8" جزء باستخدام 'VP8' (لاحظ المسافة الكبيرة من الأحرف الرابعة) كـ FourCC، أو (2) 'VP8L' كتلة باستخدام "VP8L" باعتبارها FourCC.

تنسيقات 'VP8' و"VP8L" يتم توضيح الأجزاء على النحو الموضَّح في الأقسام تنسيق ملف بسيط (فقدان الجهاز) وتنسيق ملف بسيط (بدون فقدان البيانات) على التوالي.

الملف الشخصي للألوان

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('ICCP')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                       Color Profile                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
ملفّ تعريف الألوان: حجم القطعة بايت
ملف ICC الشخصي:

يجب أن يظهر هذا المقطع قبل بيانات الصورة.

ينبغي أن يكون هناك مقطع واحد على الأكثر من هذا القبيل. إذا كان هناك المزيد من هذه الأجزاء، قد يتم تجاهل الكل باستثناء الأول. راجِع مواصفات IC لمعرفة التفاصيل.

إذا لم يكن هذا المقطع متوفرًا، يجب افتراض أنّ sRGB.

البيانات الوصفية

يمكن تخزين البيانات الوصفية في "EXIF" أو "XMP" كتل.

من المفترض أن يكون هناك قطعة واحدة على الأكثر من كل نوع (EXIF وXMP). إذا كان هناك مزيد من هذه القطع، قد يتجاهل القرّاء كل القطع باستثناء الأولى.

ويتم تعريف المقاطع على النحو التالي:

"EXIF" مجموعة:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('EXIF')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        Exif Metadata                          :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
البيانات الوصفية لملف Exif: حجم الجزء بايت
البيانات الوصفية للصورة بتنسيق Exif

"XMP " مجموعة:

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                      ChunkHeader('XMP ')                      |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
:                        XMP Metadata                           :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
بيانات XMP الوصفية: حجم القطع بايت
البيانات الوصفية للصور بتنسيق XMP

يُرجى العِلم أنّ الحرف الرابع في معرّف FourCC الخاص بتنسيق XMP هو مسافة ASCII (0x20).

يمكن العثور على إرشادات إضافية حول التعامل مع البيانات الوصفية في "إرشادات التعامل مع البيانات الوصفية" لمجموعة عمل البيانات الوصفية.

أجزاء غير معروفة

مقطع RIFF (الموضّح في القسم تنسيق ملف RIFF) الذي يختلف FourCC عن أي من الأجزاء الموضحة في هذا المستند، تُعتبر مقطعًا غير معروف.

الأسباب: يؤدي السماح بالمقاطع غير المعروفة إلى توفير شرط للإضافة المستقبلية. من التنسيق ويسمح أيضًا بتخزين أي بيانات خاصة بالتطبيق.

قد يحتوي الملف على أجزاء غير معروفة:

على القرّاء أن يتجاهلوا هذه المقاطع. على الكتاب الحفاظ على هذه الأجزاء بترتيبها الأصلي (ما لم يقصدوا تعديل هذه الأجزاء على وجه التحديد).

تجميع لوحة الرسم من الإطارات

نقدم هنا نظرة عامة حول كيفية قيام القارئ بتجميع لوحة رسم في حالة لصورة متحركة.

تبدأ العملية بإنشاء لوحة باستخدام الأبعاد المذكورة في "VP8X" مجموعة أجزاء، بعرض Canvas Width Minus One + 1 بكسل × ارتفاع Canvas Height Minus One + 1 بكسل يتحكّم الحقل Loop Count من القطعة ANIM في عدد المرات التي تتم فيها تكرار عملية عرض الصورة المتحركة. هذا Loop Count - 1 لـ قيمة Loop Count غير صفرية أو لانهائية إذا كانت قيمة Loop Count صفرًا.

في بداية كل تكرار للحلقة، يتم ملء اللوحة باستخدام لون الخلفية من القطعة ANIM أو لون يحدّده التطبيق.

تحتوي أجزاء ANMF على لقطات فردية يتم عرضها بترتيب معيّن. قبل عرض كل إطار، يتم تطبيق Disposal method للإطار السابق.

يبدأ عرض الإطار الذي تم فك ترميزه من الإحداثيات الديكارتية (2 * Frame X، 2 * Frame Y)، باستخدام الزاوية العلوية اليسرى من اللوحة كأصل. يتم عرض صورة بعرض Frame Width Minus One + 1 بكسل وFrame Height Minus One + 1 بكسل ارتفاعًا على اللوحة باستخدام Blending method.

يتم عرض اللوحة لمدة Frame Duration ملي ثانية. يستمر ذلك حتى جميع الإطارات المقدمة بواسطة 'ANMF' تم عرض الأجزاء. يُعد التكرار الحلقي الجديد ثم البدء، أو يتم ترك اللوحة بحالتها النهائية إذا تم تنفيذ جميع التكرارات مكتملة.

يوضح الرمز الزائف التالي عملية العرض. العلامة VP8X.field يعني الحقل في "VP8X". مجموعة لها الوصف نفسه

VP8X.flags.hasAnimation MUST be TRUE
canvas ← new image of size VP8X.canvasWidth x VP8X.canvasHeight with
         background color ANIM.background_color or
         application-defined color.
loop_count ← ANIM.loopCount
dispose_method ← Dispose to background color
if loop_count == 0:
  loop_count = ∞
frame_params ← nil
next chunk in image_data is ANMF MUST be TRUE
for loop = 0..loop_count - 1
  clear canvas to ANIM.background_color or application-defined color
  until eof or non-ANMF chunk
    frame_params.frameX = Frame X
    frame_params.frameY = Frame Y
    frame_params.frameWidth = Frame Width Minus One + 1
    frame_params.frameHeight = Frame Height Minus One + 1
    frame_params.frameDuration = Frame Duration
    frame_right = frame_params.frameX + frame_params.frameWidth
    frame_bottom = frame_params.frameY + frame_params.frameHeight
    VP8X.canvasWidth >= frame_right MUST be TRUE
    VP8X.canvasHeight >= frame_bottom MUST be TRUE
    for subchunk in 'Frame Data':
      if subchunk.tag == "ALPH":
        alpha subchunks not found in 'Frame Data' earlier MUST be
          TRUE
        frame_params.alpha = alpha_data
      else if subchunk.tag == "VP8 " OR subchunk.tag == "VP8L":
        bitstream subchunks not found in 'Frame Data' earlier MUST
          be TRUE
        frame_params.bitstream = bitstream_data
    apply dispose_method.
    render frame with frame_params.alpha and frame_params.bitstream
      on canvas with top-left corner at (frame_params.frameX,
      frame_params.frameY), using Blending method
      frame_params.blendingMethod.
    canvas contains the decoded image.
    Show the contents of the canvas for
    frame_params.frameDuration * 1 ms.
    dispose_method = frame_params.disposeMethod

أمثلة على تنسيقات الملفات

قد تبدو الصورة التي تم ترميزها مع فقدان البيانات مع ألفا على النحو التالي:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ALPH (alpha bitstream)
+- VP8 (bitstream)

قد تظهر الصورة التي تم ترميزها بدون فقدان البيانات على النحو التالي:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- VP8L (lossless bitstream)
+- XYZW (unknown chunk)

قد تبدو الصورة التي لا تفقد أي تفاصيل وتتضمّن ملفًا شخصيًا للألوان (ICC) وبيانات وصفية بتنسيق XMP على النحو التالي:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ICCP (color profile)
+- VP8L (lossless bitstream)
+- XMP  (metadata)

قد تظهر الصورة المتحركة التي تحتوي على بيانات Exif الوصفية على النحو التالي:

RIFF/WEBP
+- VP8X (descriptions of features used)
+- ANIM (global animation parameters)
+- ANMF (frame1 parameters + data)
+- ANMF (frame2 parameters + data)
+- ANMF (frame3 parameters + data)
+- ANMF (frame4 parameters + data)
+- EXIF (metadata)