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

مقدمة

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

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

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

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

  • الشفافية: قد تتمتع الصورة بالشفافية، أي قناة ألفا.

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

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

التسمية

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

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

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

يجب تفسير الكلمات الأساسية "MUST" و"MUST NOT" و"required" و"SHALL" و"SHALL NOT" و"SHOULD" و"SHOULD NOT" و"RECOMMENDED" و"NOT RECOMMENDED" و"MAY" و "OPTIONAL" في هذا المستند، على النحو الموضح في BCP 14 RFC 2119

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

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

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

القارئ/الكاتب
يُشار إلى الرمز الذي يقرأ ملفات WebP باسم قارئ، في حين يُشار إلى الرمز الذي يكتبها باسم كاتب.
uint16
عدد صحيح مكوَّن من 16 بت أو نهايات صغيرة وغير مُوقَّع
uint24
عدد صحيح بتنسيق 24 بت وصغير وغير مُوقَّع.
uint32
عدد صحيح 32 بت وصغير وغير موقَّع
FourCC
الرمز المكوَّن من أربعة أحرف (FourCC) هو رمز uint32 يتم إنشاؤه من خلال تسلسل أربعة أحرف ASCII بترتيب أدنى صغير. هذا يعني أنّه يتم التعامل مع "aaaa" (0x61616161) و"AAAA" (0x41414141) على أنّها FourCCs مختلفة.
الاستناد إلى واحدة
حقل عدد صحيح غير موقَّع يخزِّن القيم التي تمت إزاحتها -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                         :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
كتلة فورCC: 32 بت
يُستخدم رمز ASCII المكوَّن من أربعة أحرف لتعريف المقطع.
حجم المقطع: 32 بت (uint32)
حجم المقطع بالبايت، ولا يشمل هذا الحقل أو معرِّف المقطع أو المساحة المتروكة.
حمولة البيانات المجمّعة: حجم حجم الجزء بايت
حمولة البيانات إذا كان حجم المقطع فرديًا، تتم إضافة بايت واحد للمساحة المتروكة، والذي يجب أن يكون 0 للتوافق مع RIFF.

ملاحظة: يحتوي RIFF على اصطلاح مفاده أن مجموعات FourCCs الكبيرة بالكامل هي أجزاء عادية تنطبق على أي تنسيق ملف 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 بايت لـ "WEBP" FourCC. "يجب ألا يحتوي الملف" على أي بيانات بعد البيانات المحددة في حجم الملف. قد يحلل القرّاء هذه الملفات ويتجاهلون البيانات اللاحقة. نظرًا لأن حجم أي مقطع متساوي، فإن الحجم المحدد بواسطة عنوان RIFF هو أيضًا متساوي. يتم وصف محتويات الأجزاء الفردية في الأقسام التالية.

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

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

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

 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. للتحويل إلى نموذج أحمر أخضر أزرق، يجب استخدام الاقتراح 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 لبروتوكول نقل البيانات VP8L على تنسيق WebP فقدان بيانات 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): 1 بت
يمكنك ضبط ما إذا كان أي من إطارات الصورة يحتوي على معلومات عن الشفافية ("ألفا").
بيانات Exif الوصفية (E): 1 بت
يمكنك تحديد ما إذا كان الملف يحتوي على بيانات وصفية Exif.
بيانات XMP الوصفية (X): 1 بت
يمكنك تحديد ما إذا كان الملف يحتوي على بيانات وصفية XMP.
الرسوم المتحركة (A): 1 بت
يمكنك ضبط ما إذا كانت هذه صورة متحركة. ويجب استخدام البيانات في مجموعات ANIM وANMF للتحكّم في الصور المتحركة.
محجوز (R): 1 بت
يجب أن يكون 0. يجب أن يتجاهل القرّاء هذا الحقل.
البيانات المحجوزة: 24 بت
يجب أن يكون 0. يجب أن يتجاهل القرّاء هذا الحقل.
عرض لوحة الرسم ناقص واحد: 24 بت
عرض اللوحة بالاستناد إلى واحد بالبكسل. يبلغ عرض اللوحة الفعلي 1 + Canvas Width Minus One.
ارتفاع لوحة الرسم ناقص واحد: 24 بت
ارتفاع اللوحة بالبكسل يبلغ الارتفاع الفعلي للّوحة 1 + Canvas Height Minus One.

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

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

Animation

يتم التحكم في الرسوم المتحركة بواسطة 'ANIM' و 'ANMF' Chunks.

كتلة "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.

ملاحظة:

  • قد يحتوي لون الخلفية على قيمة ألفا غير معتمة، حتى في حال عدم ضبط علامة Alpha في VP8X' Chunk.

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

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

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

يجب أن يظهر هذا المقطع في حال ضبط علامة Animation في قسم "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 + Frame Width Minus One.
ارتفاع الإطار ناقص واحد: 24 بت (uint24)
ارتفاع الإطار المستند إلى 1 ارتفاع الإطار هو 1 + Frame Height Minus One.
مدة الإطار: 24 بت (uint24)
وقت الانتظار قبل عرض الإطار التالي، بوحدات ملي ثانية واحدة. تجدر الإشارة إلى أنّه يتم تحديد تفسير مدة الإطار 0 (وغالبًا <= 10) من خلال التنفيذ. يعيّن العديد من الأدوات والمتصفّحات حد أدنى لمدة تشبه ملف GIF.
البيانات المحجوزة: 6 بت
يجب أن يكون 0. يجب أن يتجاهل القرّاء هذا الحقل.
طريقة المزج (B): 1 بت

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

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

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

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

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

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

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

ملاحظات:

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

  • المزج ألفا:

    نظرًا لأن كل قناة من قنوات 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
    
  • يجب إجراء مزج ألفا في مساحة اللون الخطية، مع مراعاة ملف تعريف اللون في الصورة. في حال عدم توفر ملف تعريف اللون، سيُفترض أن يتم افتراض نموذج أحمر أخضر أزرق (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: المتنبئ = A
  • الطريقة 2: المتنبئ = B
  • الطريقة 3: المتنبئ = مقطع(A + B - C)

حيث clip(v) تساوي:

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

يتم استنتاج القيمة النهائية من خلال إضافة القيمة غير المضغوطة 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 Lossless Bitstream") للأبعاد الضمنية العرض × الارتفاع. وهذا يعني أنّ مصدر البيانات هذا لا يحتوي على أي عناوين تصف أبعاد الصورة.

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

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

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

Bitstream (VP8/VP8L)

يحتوي هذا المقطع على بيانات مصدر بت مضغوطة لإطار واحد.

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

يتم توضيح تنسيقَي "VP8" و"VP8L" في القسمَين Simple File Format (Lossy) وتنسيق ملف بسيط (بدون فقدان) على التوالي.

ملف تعريف الألوان

 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

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

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

مقاطع غير معروفة

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

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

قد يحتوي الملف على مقاطع غير معروفة:

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

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

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

تبدأ العملية بإنشاء لوحة رسم باستخدام الأبعاد الموضحة في كتلة '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' Chunks. بعد ذلك يبدأ تكرار تكراري جديد أو تُترك اللوحة في حالتها النهائية إذا تم إكمال جميع التكرارات.

يوضّح الرمز الزائف التالي عملية العرض. تعني العلامة 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.
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
    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)