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

مقدمة

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

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

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

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

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

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

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

التسمية

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

اسم تنسيق الحاويةتنسيق WebP
امتداد اسم الملف.webp
نوع MIMEimage/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) يتم التعامل معها على أنّها FourCCs مختلفة.
نموذج 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 للبيانات

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

يتم وصف مواصفات تنسيق بث البيانات البتية لـ VP8 في VP8 Data Format دليل فك الترميز يُرجى العِلم أنّ رأس إطار 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): 1 بت
حدِّد ما إذا كان أي من إطارات الصورة يحتوي على معلومات الشفافية. ("ألفا").
بيانات Exif الوصفية (E): بت واحد
يمكنك ضبط ما إذا كان الملف يحتوي على بيانات Exif الوصفية.
بيانات XMP الوصفية (X): 1 بت
يمكنك ضبط ما إذا كان الملف يتضمّن بيانات XMP الوصفية.
الحركة (أ): بت واحد
يمكنك تحديد ما إذا كانت هذه صورة متحركة. البيانات في "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 كتل.

"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" مجموعة:

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

 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. يجب أن يتجاهل القرّاء هذا الحقل.
طريقة المزج (B): 1 بت

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

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

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

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

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

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

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

ملاحظات:

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

  • مزج ألفا:

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

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

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

بث بت مشفر بتنسيق ألفا.

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

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

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

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

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

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

    بعد فك ترميز بث الصور إلى اللون ألفا أو الأحمر أو الأخضر أو الأزرق (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

لاحظ أن الحرف الرابع في 'XMP' FourCC عبارة عن مسافة 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)