ভূমিকা
WebP হল একটি ইমেজ ফরম্যাট যা হয় (i) VP8 কী ফ্রেম এনকোডিং ব্যবহার করে ইমেজ ডেটাকে ক্ষতিকর উপায়ে সংকুচিত করতে বা (ii) WebP ক্ষতিহীন এনকোডিং। এই এনকোডিং স্কিমগুলিকে এটিকে পুরানো ফরম্যাটের তুলনায় আরও দক্ষ করে তুলতে হবে, যেমন JPEG, GIF এবং PNG৷ এটি নেটওয়ার্কের মাধ্যমে দ্রুত চিত্র স্থানান্তরের জন্য অপ্টিমাইজ করা হয়েছে (উদাহরণস্বরূপ, ওয়েবসাইটগুলির জন্য)। WebP ফর্ম্যাটে অন্যান্য ফর্ম্যাটের সাথে বৈশিষ্ট্য সমতা (রঙ প্রোফাইল, মেটাডেটা, অ্যানিমেশন, ইত্যাদি) রয়েছে৷ এই নথিটি একটি WebP ফাইলের গঠন বর্ণনা করে।
WebP কন্টেইনার (অর্থাৎ WebP-এর জন্য RIFF কন্টেনার) WebP-এর মৌলিক ব্যবহারের ক্ষেত্রে (অর্থাৎ, VP8 কী ফ্রেম হিসেবে এনকোড করা একটি একক ছবি সম্বলিত একটি ফাইল) বৈশিষ্ট্য সমর্থন করে। WebP ধারক নিম্নলিখিত জন্য অতিরিক্ত সমর্থন প্রদান করে:
লসলেস কম্প্রেশন: ওয়েবপি লসলেস ফরম্যাট ব্যবহার করে একটি ছবি ক্ষতিহীনভাবে সংকুচিত করা যেতে পারে।
মেটাডেটা: একটি ছবিতে মেটাডেটা সংরক্ষিত থাকতে পারে এক্সচেঞ্জেবল ইমেজ ফাইল ফরম্যাট (Exif) বা এক্সটেনসিবল মেটাডেটা প্ল্যাটফর্ম (XMP) ফরম্যাটে।
স্বচ্ছতা: একটি ছবিতে স্বচ্ছতা থাকতে পারে, অর্থাৎ একটি আলফা চ্যানেল।
রঙের প্রোফাইল: ইন্টারন্যাশনাল কালার কনসোর্টিয়াম দ্বারা বর্ণিত একটি ছবিতে একটি এমবেডেড আইসিসি প্রোফাইল থাকতে পারে।
অ্যানিমেশন: একটি চিত্রের মধ্যে বিরতি সহ একাধিক ফ্রেম থাকতে পারে, এটি একটি অ্যানিমেশন তৈরি করে।
নামকরণ
WebP কন্টেইনার উল্লেখ করার সময় নিম্নলিখিত প্রকারগুলি ব্যবহার করার জন্য সুপারিশ করা হয়:
ধারক বিন্যাস নাম | ওয়েবপি |
ফাইলের নাম এক্সটেনশন | ওয়েবপি |
MIME- প্রকার | ছবি/ওয়েবপি |
ইউনিফর্ম টাইপ আইডেন্টিফায়ার | org.webmproject.webp |
পরিভাষা ও মৌলিক বিষয়
মূল শব্দগুলি "অবশ্যই", "অবশ্যই নয়", "প্রয়োজন", "শালা", "শালা নয়", "উচিত", "উচিত নয়", "প্রস্তাবিত", "প্রস্তাবিত নয়", "মেয়", এবং "ঐচ্ছিক" " এই নথিতে ব্যাখ্যা করা হবে BCP 14 RFC 2119 RFC 8174 -এ বর্ণিত হিসাবে যখন, এবং শুধুমাত্র যখন, সেগুলি সমস্ত রাজধানীতে প্রদর্শিত হবে, যেমনটি এখানে দেখানো হয়েছে৷
একটি WebP ফাইলে হয় একটি স্থির চিত্র (অর্থাৎ, পিক্সেলের একটি এনকোডেড ম্যাট্রিক্স) বা একটি অ্যানিমেশন থাকে। ঐচ্ছিকভাবে, এতে স্বচ্ছতার তথ্য, একটি রঙের প্রোফাইল এবং মেটাডেটাও থাকতে পারে। আমরা ছবির ক্যানভাস হিসাবে পিক্সেলের ম্যাট্রিক্স উল্লেখ করি।
খণ্ড চিত্রে বিট সংখ্যায়ন সবচেয়ে উল্লেখযোগ্য বিটের ('MSB 0') জন্য 0
থেকে শুরু হয়, যেমনটি RFC 1166- এ বর্ণিত হয়েছে।
নীচে এই নথি জুড়ে ব্যবহৃত অতিরিক্ত শর্তাবলী রয়েছে:
- পাঠক/লেখক
- যে কোডটি WebP ফাইলগুলিকে পাঠ করে তাকে পাঠক হিসাবে উল্লেখ করা হয়, যখন সেগুলিকে লেখার কোডটিকে একজন লেখক হিসাবে উল্লেখ করা হয়৷
- uint16
- একটি 16-বিট, সামান্য-এন্ডিয়ান, স্বাক্ষরবিহীন পূর্ণসংখ্যা।
- uint24
- একটি 24-বিট, সামান্য-এন্ডিয়ান, স্বাক্ষরবিহীন পূর্ণসংখ্যা।
- uint32
- একটি 32-বিট, সামান্য-এন্ডিয়ান, স্বাক্ষরবিহীন পূর্ণসংখ্যা।
- ফোরসিসি
- একটি চার-অক্ষরের কোড (FourCC) হল একটি uint32 যা চারটি ASCII অক্ষর লিটল-এন্ডিয়ান ক্রমে একত্রিত করে তৈরি করা হয়েছে। এর মানে 'aaaa' (0x61616161) এবং 'AAAA' (0x41414141) আলাদা ফোরসিসি হিসেবে ধরা হয়।
- 1-ভিত্তিক
- একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা ক্ষেত্র সংরক্ষণের মান
-1
দ্বারা অফসেট, উদাহরণস্বরূপ, এই ধরনের একটি ক্ষেত্র 25 হিসাবে 24 মান সংরক্ষণ করবে। - চাঙ্কহেডার ('ABCD')
- পৃথক খণ্ডের ফোরসিসি এবং খণ্ড আকারের শিরোনাম বর্ণনা করতে ব্যবহৃত হয়, যেখানে 'ABCD' হল খণ্ডের জন্য ফোরসিসি। এই উপাদানটির আকার 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 :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
- খণ্ড ফোরসিসি: 32 বিট
- খণ্ড শনাক্তকরণের জন্য ব্যবহৃত ASCII চার-অক্ষরের কোড।
- খণ্ডের আকার: 32 বিট ( uint32 )
- বাইটে খণ্ডের আকার, এই ক্ষেত্র, খণ্ড শনাক্তকারী বা প্যাডিং অন্তর্ভুক্ত নয়।
- খণ্ড পেলোড: খণ্ড সাইজ বাইট
- ডেটা পেলোড। যদি খণ্ডের আকার বিজোড় হয়, একটি একক প্যাডিং বাইট -- যা RIFF এর সাথে মানানসই হতে হবে
0
-- যোগ করা হয়৷
দ্রষ্টব্য: 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 GiB মাইনাস 2 বাইট।
- 'WEBP': 32 বিট
- ASCII অক্ষর 'W', 'E', 'B', 'P'।
একটি WebP ফাইল ফোরসিসি 'WEBP' সহ একটি RIFF হেডার দিয়ে শুরু হওয়া আবশ্যক। হেডারে ফাইলের আকার হল 'WEBP' FourCC-এর জন্য প্লাস 4
বাইট অনুসরণ করা অংশগুলির মোট আকার। ফাইলের আকার দ্বারা নির্দিষ্ট করা ডেটার পরে ফাইলটিতে কোনও ডেটা থাকা উচিত নয়৷ পাঠকরা এই ধরনের ফাইল পার্স করতে পারে, ট্রেলিং ডেটা উপেক্ষা করে। যে কোন খণ্ডের আকার সমান, 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 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
হতে হবে। পাঠকদের অবশ্যই এই ক্ষেত্রটি উপেক্ষা করতে হবে। - আইসিসি প্রোফাইল (আই): 1 বিট
- ফাইলটিতে একটি 'ICCP' অংশ থাকলে সেট করুন।
- আলফা (L): 1 বিট
- ছবির ফ্রেমে স্বচ্ছতা তথ্য ("আলফা") থাকলে সেট করুন।
- Exif মেটাডেটা (E): 1 বিট
- ফাইলটিতে Exif মেটাডেটা থাকলে সেট করুন।
- XMP মেটাডেটা (X): 1 বিট
- ফাইলটিতে XMP মেটাডেটা থাকলে সেট করুন।
- অ্যানিমেশন (A): 1 বিট
- এটি একটি অ্যানিমেটেড ছবি হলে সেট করুন। অ্যানিমেশন নিয়ন্ত্রণ করতে 'ANIM' এবং 'ANMF' খণ্ডে ডেটা ব্যবহার করা উচিত।
- সংরক্ষিত (আর): 1 বিট
-
0
হতে হবে। পাঠকদের অবশ্যই এই ক্ষেত্রটি উপেক্ষা করতে হবে। - সংরক্ষিত: 24 বিট
-
0
হতে হবে। পাঠকদের অবশ্যই এই ক্ষেত্রটি উপেক্ষা করতে হবে। - ক্যানভাস প্রস্থ মাইনাস ওয়ান: 24 বিট
- পিক্সেলে ক্যানভাসের 1-ভিত্তিক প্রস্থ। প্রকৃত ক্যানভাসের প্রস্থ হল
1 + Canvas Width Minus One
। - ক্যানভাসের উচ্চতা মাইনাস ওয়ান: 24 বিট
- পিক্সেলে ক্যানভাসের 1-ভিত্তিক উচ্চতা। প্রকৃত ক্যানভাসের উচ্চতা হল
1 + Canvas Height Minus One
।
ক্যানভাসের প্রস্থ এবং ক্যানভাসের উচ্চতা অবশ্যই সর্বাধিক 2^32 - 1
হতে হবে।
ভবিষ্যতের স্পেসিফিকেশন আরও ক্ষেত্র যোগ করতে পারে। অজানা ক্ষেত্র উপেক্ষা করা আবশ্যক.
অ্যানিমেশন
একটি অ্যানিমেশন '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' অংশে অ্যানিমেশন পতাকা সেট করা থাকলে এই খণ্ডটি অবশ্যই উপস্থিত হবে৷ যদি অ্যানিমেশন পতাকা সেট করা না থাকে এবং এই অংশটি উপস্থিত থাকে তবে এটি অবশ্যই উপেক্ষা করা উচিত।
'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) এর ফ্রেমের সময়কালের ব্যাখ্যা বাস্তবায়ন দ্বারা সংজ্ঞায়িত করা হয়। অনেক টুল এবং ব্রাউজার জিআইএফ-এর মতো ন্যূনতম সময়কাল নির্ধারণ করে।
- সংরক্ষিত: 6 বিট
-
0
হতে হবে। পাঠকদের অবশ্যই এই ক্ষেত্রটি উপেক্ষা করতে হবে। - ব্লেন্ডিং পদ্ধতি (B): 1 বিট
বর্তমান ফ্রেমের স্বচ্ছ পিক্সেলগুলিকে পূর্ববর্তী ক্যানভাসের অনুরূপ পিক্সেলের সাথে কীভাবে মিশ্রিত করা হবে তা নির্দেশ করে:
0
: আলফা-ব্লেন্ডিং ব্যবহার করুন। পূর্ববর্তী ফ্রেমটি নিষ্পত্তি করার পরে, আলফা-ব্লেন্ডিং ব্যবহার করে বর্তমান ফ্রেমটি ক্যানভাসে রেন্ডার করুন (নীচে দেখুন)। যদি বর্তমান ফ্রেমে একটি আলফা চ্যানেল না থাকে, তাহলে অনুমান করুন আলফা মান 255, কার্যকরভাবে আয়তক্ষেত্রটি প্রতিস্থাপন করে।1
: মিশ্রিত করবেন না। পূর্ববর্তী ফ্রেমটি নিষ্পত্তি করার পরে, বর্তমান ফ্রেমের দ্বারা আচ্ছাদিত আয়তক্ষেত্রটি ওভাররাইট করে ক্যানভাসে বর্তমান ফ্রেমটি রেন্ডার করুন।
- নিষ্পত্তি পদ্ধতি (D): 1 বিট
ক্যানভাসে (পরবর্তী ফ্রেম রেন্ডার করার আগে) প্রদর্শিত হওয়ার পরে বর্তমান ফ্রেমটি কীভাবে আচরণ করা হবে তা নির্দেশ করে:
0
: নিষ্পত্তি করবেন না। ক্যানভাসকে যেমন আছে তেমনি রেখে দিন।1
: ব্যাকগ্রাউন্ডের রঙে নিষ্পত্তি করুন। বর্তমান ফ্রেমে আচ্ছাদিত ক্যানভাসে আয়তক্ষেত্রটি 'ANIM' খণ্ডে নির্দিষ্ট করা পটভূমির রঙ দিয়ে পূরণ করুন।
নোট :
ফ্রেম নিষ্পত্তি শুধুমাত্র ফ্রেম আয়তক্ষেত্রে প্রযোজ্য, অর্থাৎ, ফ্রেম X , ফ্রেম Y , ফ্রেমের প্রস্থ এবং ফ্রেমের উচ্চতা দ্বারা সংজ্ঞায়িত আয়তক্ষেত্র। এটি পুরো ক্যানভাসকে কভার করতে পারে বা নাও পারে।
আলফা-মিশ্রণ:
প্রদত্ত যে R, G, B, এবং A চ্যানেলগুলির প্রতিটি 8 বিট, এবং RGB চ্যানেলগুলি আলফা দ্বারা পূর্বে গুণিত নয় , 'src'-এর সাথে 'dst' মিশ্রিত করার সূত্রটি হল:
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) ধরে নিতে হবে। (উল্লেখ্য যে ~2.2 এর গামার কারণে sRGB-কেও লিনিয়ারাইজ করা দরকার।)
- ফ্রেম ডেটা: খণ্ড সাইজ বাইট -
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
: ভবিষ্যদ্বাণী = ক্লিপ (A + B - C)
যেখানে clip(v)
এর সমান:
- 0 যদি v < 0,
- 255 যদি v > 255, বা
- v অন্যথায়
ভবিষ্যদ্বাণীকারীতে ডিকম্প্রেসড মান X
যোগ করে এবং [256..511] পরিসরকে [0..255] একের মধ্যে মোড়ানোর জন্য মডুলো-256 গাণিতিক ব্যবহার করে চূড়ান্ত মানটি নেওয়া হয়:
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-বিট স্বচ্ছতার মান থাকে।
লসলেস ফরম্যাট কম্প্রেশন: বাইট সিকোয়েন্স হল একটি সংকুচিত ইমেজ-স্ট্রিম (যেমন "ওয়েবপি লসলেস বিটস্ট্রিম ফরম্যাটে বর্ণিত" ) অন্তর্নিহিত মাত্রা প্রস্থ x উচ্চতা। অর্থাৎ, এই ইমেজ-স্ট্রীমে ছবির মাত্রা বর্ণনা করে এমন কোনো হেডার নেই।
যুক্তি : মাত্রাগুলি ইতিমধ্যেই অন্যান্য উত্স থেকে জানা গেছে, তাই সেগুলিকে আবার সংরক্ষণ করা অপ্রয়োজনীয় এবং ত্রুটির প্রবণতা হবে৷
লসলেস ফরম্যাট স্পেসিফিকেশনে বর্ণিত প্রক্রিয়া অনুসরণ করে একবার ইমেজ-স্ট্রিমটি আলফা, লাল, সবুজ, নীল (ARGB) রঙের মানগুলিতে ডিকোড করা হলে, স্বচ্ছতার তথ্য অবশ্যই ARGB চতুষ্পদ এর সবুজ চ্যানেল থেকে বের করতে হবে।
যুক্তি : গ্রিন চ্যানেলটিকে স্পেসিফিকেশনে অতিরিক্ত রূপান্তর পদক্ষেপের অনুমতি দেওয়া হয়েছে -- অন্যান্য চ্যানেলের বিপরীতে -- যা কম্প্রেশন উন্নত করতে পারে।
বিটস্ট্রিম (VP8/VP8L)
এই খণ্ডটিতে একটি একক ফ্রেমের জন্য সংকুচিত বিটস্ট্রিম ডেটা রয়েছে।
একটি বিটস্ট্রিম খণ্ড হয় (i) একটি 'VP8' খণ্ড, 'VP8' ব্যবহার করে (উল্লেখ্য চতুর্থ-অক্ষরের স্থানটি লক্ষ্য করুন) এর FourCC হিসাবে, অথবা (ii) একটি '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 স্পেসিফিকেশন দেখুন।
এই খণ্ডটি উপস্থিত না থাকলে, 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 ফরম্যাটে ইমেজ মেটাডেটা।
'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 এই নথিতে বর্ণিত যে কোনো খণ্ড থেকে আলাদা, একটি অজানা খণ্ড হিসেবে বিবেচিত হয়।
যুক্তি : অজানা অংশগুলিকে অনুমতি দেওয়া ফরম্যাটের ভবিষ্যত সম্প্রসারণের জন্য একটি বিধান দেয় এবং কোনো অ্যাপ্লিকেশন-নির্দিষ্ট ডেটা সংরক্ষণের অনুমতি দেয়।
একটি ফাইলে অজানা অংশ থাকতে পারে:
- ফাইলের শেষে, এক্সটেন্ডেড ওয়েবপি ফাইল হেডার বিভাগে বর্ণিত হিসাবে, বা
- 'ANMF' খণ্ডের শেষে, যেমন অ্যানিমেশন বিভাগে বর্ণিত হয়েছে।
পাঠকদের এই অংশগুলি উপেক্ষা করা উচিত। লেখকদের তাদের মূল ক্রমানুসারে সেগুলি সংরক্ষণ করা উচিত (যদি না তারা বিশেষভাবে এই অংশগুলিকে সংশোধন করতে চায়)।
ফ্রেম থেকে ক্যানভাস সমাবেশ
এখানে আমরা একটি সংক্ষিপ্ত বিবরণ প্রদান করি কিভাবে একজন পাঠককে একটি অ্যানিমেটেড চিত্রের ক্ষেত্রে একটি ক্যানভাস একত্রিত করতে হবে৷
প্রক্রিয়াটি শুরু হয় 'VP8X' খণ্ডে দেওয়া মাত্রা ব্যবহার করে একটি ক্যানভাস তৈরি করে, Canvas Width Minus One + 1
পিক্সেল চওড়া Canvas Height Minus One + 1
পিক্সেল উচ্চ। 'ANIM' খণ্ড থেকে Loop Count
ক্ষেত্র নিয়ন্ত্রণ করে যে অ্যানিমেশন প্রক্রিয়াটি কতবার পুনরাবৃত্তি হয়। এটি হল 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' খণ্ড দ্বারা প্রদত্ত সমস্ত ফ্রেম প্রদর্শিত না হওয়া পর্যন্ত এটি চলতে থাকে। তারপরে একটি নতুন লুপ পুনরাবৃত্তি শুরু হয়, অথবা সমস্ত পুনরাবৃত্তি সম্পন্ন হলে ক্যানভাসটি তার চূড়ান্ত অবস্থায় রেখে দেওয়া হয়।
নিম্নলিখিত pseudocode রেন্ডারিং প্রক্রিয়া চিত্রিত. স্বরলিপি 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)