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

مقدمة

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

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

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

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

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

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

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

التسمية

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

اسم تنسيق الحاويةتنسيق WebP
امتداد اسم الملف‎.webp
نوع MIMEصورة/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) على أنّهما FourCCs مختلفة.
الأرقام البدء من 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 اصطلاحًا يقضي بأنّ مجموعات FourCC المكونة من أحرف كبيرة فقط هي مجموعات عادية تنطبق على أي تنسيق ملف RIFF، في حين أنّ مجموعات FourCC الخاصة بتنسيق ملف معيّن تكون مكتوبة بأحرف صغيرة فقط. لا يتّبع 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 بايت لترميز FourCC الخاص بتنسيق WEBP. "ينبغي ألا يحتوي الملف" على أي بيانات بعد البيانات المحددة في حجم الملف. وقد يحلِّل القرّاء مثل هذه الملفات متجاهلين البيانات اللاحقة. بما أنّ حجم أيّ قطعة يكون زوجيًا، يكون الحجم الذي يقدّمه رأس 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 وترميزها. يُرجى العِلم أنّ عنوان إطار 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): بتَان
يجب أن يكون
0. يجب أن يتجاهل القرّاء هذا الحقل.
ملف ICC (I): بت واحد
اضبط هذا الخيار إذا كان الملف يحتوي على قطعة ICCP.
ألفا (L): 1 بت
حدِّد ما إذا كان أيّ من إطارات الصورة يحتوي على معلومات شفافية ("ألفا").
بيانات Exif الوصفية (E): بت واحد
يمكنك ضبط ما إذا كان الملف يحتوي على بيانات Exif الوصفية.
بيانات XMP الوصفية (X): 1 بت
حدِّد ما إذا كان الملف يحتوي على بيانات وصفية بتنسيق XMP.
الرسوم المتحركة (أ): 1 بت
يمكنك تحديد ما إذا كانت هذه صورة متحركة. يجب استخدام البيانات في وحدات ANIM وANMF للتحكّم في الصورة المتحركة.
محجوز (R): 1 بت
يجب أن يكون
0. على القرّاء تجاهل هذا الحقل.
محجوز: 24 بت
يجب أن يكون
0. على القرّاء تجاهل هذا الحقل.
عرض اللوحة ناقص واحد: 24 بت
العرض بالبكسل للوحة، مع البدء من 1 يبلغ عرض اللوحة الفعلي 1 + Canvas Width Minus One.
ارتفاع اللوحة مطروحًا منه واحد: 24 بت
ارتفاع رسم واحد للوحة الرسم بالبكسل يبلغ ارتفاع اللوحة الفعلي 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، يعني ذلك إلى أجل غير مسمى.

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

قطعة "ANMF":

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

 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                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
الإطار س: 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. على القرّاء تجاهل هذا الحقل.
طريقة الدمج (ب): 1 بت

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

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

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

طريقة التخلص (D): 1 بت

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

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

  • 1: تخلص من لون الخلفية. املأ المستطيل على اللوحة الذي يغطي الإطار الحالي بلون الخلفية المحدّد في القطعة ANIM.

ملاحظات:

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

  • مزج ألفا:

    بما أنّ كل قناة من قنوات 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"، بيانات الإطار، من أجزاء مضافة فردية على النحو الموضّح في تنسيق ملف 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): بتَان
يجب أن يكون 0. على القرّاء تجاهل هذا الحقل.
المعالجة المُسبَقة (P): 2 بت

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

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

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

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

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

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

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

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

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

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

حيث يكون clip(v) مساويًا لما يلي:

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

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

alpha = (predictor + X) % 256

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

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

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

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

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

يحتوي هذا الجزء الاختياري على بيانات شفافية مُشفَّرة لهذا الإطار. يجب ألّا يحتوي الإطار الذي يحتوي على قطعة "VP8L" على هذه القطعة.

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

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

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

  • ضغط التنسيق بدون فقدان المعلومات: تُمثّل تسلسل البايت مجرى صورة مضغوطًا (كما هو موضّح في "تنسيق WebP لبث البتات بدون فقدان المعلومات") للأبعاد الضمنية العرض × الارتفاع. وهذا يعني أنّ مجموعة بث الصور هذه لا تحتوي على أيّ عناوين تصف أبعاد الصورة.

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

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

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

Bitstream (VP8/VP8L)

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

قد يكون مقطع البث بت إما (1) مقطع "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

يجب أن يظهر هذا الجزء قبل بيانات الصورة.

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

في حال عدم توفّر هذا الجزء، يجب افتراض استخدام 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)