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

مقدمة

وWebP هو تنسيق صورة يستخدم إما (i) ترميز الإطار الرئيسي 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

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

يجب استخدام الكلمات الرئيسية "يجب" و"يجب ألا" و"مطلوب" و"SHALL" و"SHALL NOT" و"يجب" "SHOULD NOT" و"RECOMMENDED" و"غير مستحسن" و"أيار" و"OPTIONAL" في هذه الدورة يجب تفسير المستند على النحو الموضّح في 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 وChunk Size في المجموعات الفردية، حيث تُكتب "الاستقطاب والتقديم والتواصل والتوجيه" (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

يُرجى العِلم أنّ الحرف الرابع في معرّف FourCC‏ "VP8" هو مسافة ASCII‏ (0x20).

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

توضّح مواصفات VP8 كيفية فك ترميز الصورة إلى تنسيق Y'CbCr. إلى التحويل إلى نموذج أحمر أخضر أزرق، فيجب استخدام اقتراح 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 Lossless Bitstream لاحظ أن عنوان 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): 1 بت
يمكنك ضبط ما إذا كان الملف يحتوي على معرّف "ICCP" كتلة
ألفا (L): بت واحد
حدِّد ما إذا كان أيّ من إطارات الصورة يحتوي على معلومات شفافية ("ألفا").
بيانات Exif الوصفية (E): بت واحد
حدِّد ما إذا كان الملف يحتوي على بيانات Exif الوصفية.
بيانات XMP الوصفية (X): 1 بت
حدِّد ما إذا كان الملف يحتوي على بيانات وصفية بتنسيق XMP.
الحركة (أ): بت واحد
يمكنك تحديد ما إذا كانت هذه صورة متحركة. البيانات في "ANIM" وANMF يجب أن تكون الأجزاء للتحكّم في الصورة المتحركة
محجوز (R): بت واحد
يجب أن يكون
0. على القرّاء تجاهل هذا الحقل.
محجوز: 24 بت
يجب أن يكون
0. على القرّاء تجاهل هذا الحقل.
عرض اللوحة ناقص واحد: 24 بت
عرض واحد للوحة بالبكسل. عرض اللوحة الفعلي هو 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                            :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
الإطار 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 للإطار وعرض الإطار و height للإطار. وقد لا يغطي اللوحة بأكملها.

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

    وبما أن كل قناة من قنوات R وG وB وA هي 8 بتات، فإن النموذج اللوني أحمر أخضر أزرق القنوات لا يتم ضربها مسبقًا في ألفا، وهي صيغة مزج "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
    
  • ينبغي إجراء مزج ألفا في مساحة لون خطية، مع الأخذ في الاعتبار الملف الشخصي للألوان للصورة. إذا كان ملف تعريف الألوان هو غير موجود، يُفترض أن يتم الافتراض بأن النموذج اللوني أحمر أخضر أزرق (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): 2 بت
يجب أن يكون 0. يجب أن يتجاهل القرّاء هذا الحقل.
المعالجة المُسبَقة (P): 2 بت

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

الأسباب: تتوفّر معلومات الشفافية حاليًا ضمن "VP8L". كتلة.

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

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

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

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

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

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

بث البيانات (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)