আধুনিক ওয়েবে ভয়ঙ্করভাবে উপযোগী না হলেও, GIF (গ্রাফিক্স ইন্টারচেঞ্জ ফরম্যাট) ইমেজ এনকোডিং এর মূল ধারণাগুলির একটি কঠিন ভূমিকা প্রদান করে।
GIF ইমেজ ডেটার জন্য একটি মোড়ক হিসাবে ভাবা যেতে পারে। এটির একটি ভিউপোর্ট রয়েছে, যাকে "লজিক্যাল স্ক্রিন" বলা হয়, যেখানে ছবির ডেটার পৃথক ফ্রেমগুলি আঁকা হয় - কিছুটা ফটোশপ নথিতে স্তরের মতো। এভাবেই GIF তার ফ্লিপবুক-এর মতো অ্যানিমেশনকে সমর্থন করে: একটি একক ফ্রেম লজিক্যাল স্ক্রিনে আঁকা হয়, তারপরে আরেকটি দ্বারা প্রতিস্থাপিত হয়, তারপরে আরেকটি। অবশ্যই, এই পার্থক্যটি গুরুত্বপূর্ণ নয় যখন আমরা একটি স্ট্যাটিক জিআইএফ নিয়ে কাজ করি, যা লজিক্যাল স্ক্রিনে আঁকা একটি একক ফ্রেম দিয়ে তৈরি।
আপনি যদি কৌতূহলী হন তবে GIF একটি ক্ষতিহীন ডেটা কম্প্রেশন পদ্ধতি ব্যবহার করে - " Lempel–Ziv–Welch " অ্যালগরিদমের একটি রূপ৷ এই অ্যালগরিদমটি কীভাবে কাজ করে তার সূক্ষ্ম বিবরণ আমাদের এখানে প্রবেশ করার প্রয়োজনের চেয়ে বেশি, তবে উচ্চ স্তরে: এটি কিছুটা "উগ্লিফাইং" জাভাস্ক্রিপ্টের মতো কাজ করে, যেখানে ফাইল জুড়ে বারবার অক্ষরগুলির স্ট্রিংগুলি এক ধরণের অভ্যন্তরীণ অভিধানে সংরক্ষণ করা হয় , তাই প্রতিবার তারা উপস্থিত হওয়ার পুনরাবৃত্তি না করে তাদের উল্লেখ করা যেতে পারে।
ঠিক আছে, অ্যালগরিদম পেইন্ট-বাই-সংখ্যার মতো সহজ নয় । এটি পিক্সেল রঙের পুনরাবৃত্ত ক্রম খুঁজে পেতে রঙের কোডগুলির তৈরি করা টেবিলের মাধ্যমে আবার পদক্ষেপ করে এবং উল্লেখযোগ্য কোডগুলির একটি দ্বিতীয় টেবিল তৈরি করে। কোনো সময়েই কোনো ইমেজ ডেটা হারিয়ে যায় না, তবে—শুধু বাছাই করা হয়েছে এবং এমনভাবে পুনর্গঠিত করা হয়েছে যা মৌলিকভাবে পরিবর্তন না করেই পড়া যায়।
যদিও GIF প্রযুক্তিগতভাবে লসলেস কম্প্রেশন ব্যবহার করে, এটির একটি বড় সীমাবদ্ধতা রয়েছে যা চিত্রের গুণমানকে মারাত্মকভাবে প্রভাবিত করে: একটি ছবিকে GIF হিসাবে সংরক্ষণ করার ফলে সর্বদা বিশ্বস্ততা হ্রাস পাবে, যদি না ছবিটি ইতিমধ্যে 256 বা তার কম রঙ ব্যবহার করে।
GIF এর লজিক্যাল স্ক্রিনে আঁকা প্রতিটি ফ্রেমে সর্বাধিক 256টি রঙ থাকতে পারে। GIF এছাড়াও "সূচী স্বচ্ছতা" সমর্থন করে, যেখানে একটি স্বচ্ছ পিক্সেল রঙ টেবিলে একটি স্বচ্ছ "রঙ" এর সূচক উল্লেখ করবে।
আউটপুট মানগুলির একটি ছোট, আনুমানিক সেটে মানগুলির একটি পরিসর হ্রাস করার অনুশীলনকে বলা হয় কোয়ান্টাইজেশন , একটি শব্দ যা আপনি চিত্র এনকোডিং সম্পর্কে শেখার সময় অনেক কিছু দেখতে পাবেন। এই প্যালেট কোয়ান্টাইজেশনের ফলাফল সাধারণত সুস্পষ্ট হয়:
এই প্রক্রিয়াটি আরও ভালভাবে বোঝার জন্য, আমার বিবরণ থেকে আপনি যে রাস্টার চিত্রের গ্রিডটি পুনরায় তৈরি করতে সক্ষম হয়েছিলেন সে সম্পর্কে আবার চিন্তা করুন।
এইবার, সেই আসল চিত্রটিতে আরও একটু বিশদ যোগ করুন: আরও কয়েকটি পিক্সেল, যার মধ্যে একটি নীলের একটু গাঢ় ছায়া:
কোনো কম্প্রেশন অনুপস্থিত—তাই বলতে গেলে—আপনি এই গ্রিডটিকে এভাবে বর্ণনা করতে পারেন:
সারি এক, কলাম এক হল #0000FF। সারি এক, কলাম দুই হল #0000FF। সারি এক, কলাম তিন হল #0000FF। সারি এক, কলাম চার হল #FF0000। সারি দুই, কলাম এক হল #0000FF। সারি দুই, কলাম দুই হল #000085। সারি দুই, কলাম তিন হল #0000FF। সারি দুই, কলাম চার হল #FF0000।
GIF-এর ক্ষতিহীন ডেটা কম্প্রেশন এবং কালার ইনডেক্সিংয়ের মতো কিছু ব্যবহার করে, আপনি এটিকে এভাবে বর্ণনা করতে পারেন:
A: #0000FF, B: #FF0000, C: #000085। সারি এক, কলাম এক থেকে তিনটি হল A. সারি এক, কলাম চার হল B. সারি দুটি, কলাম এক হল A. সারি দুটি, কলাম দুটি হল C. সারি দুটি, কলাম তিনটি হল A. সারি দুটি, কলাম চারটি B।
এটি কয়েকটি জায়গায় পিক্সেল-বাই-পিক্সেল বিবরণকে ঘনীভূত করতে পরিচালনা করে ("কলাম এক থেকে তিনটি হয়..."), এবং একটি অভিধানে, বিভিন্ন ধরণের, সামনের দিকে বারবার রঙ সংজ্ঞায়িত করে কয়েকটি অক্ষর সংরক্ষণ করে। চাক্ষুষ বিশ্বস্ততা কোন পরিবর্তন নেই. তথ্য কোন ক্ষতি ছাড়া সংকুচিত করা হয়েছে.
আপনি দেখতে পাচ্ছেন, যাইহোক, একক গাঢ় নীল পিক্সেল আমাদের এনকোডিংয়ের আকারের উপর একটি বড় প্রভাব ফেলছে। আমি যদি নিজেকে একটি কোয়ান্টাইজড কালার প্যালেটে সীমাবদ্ধ রাখি, তবে এটি আরও অনেক কম করা যেতে পারে:
A: #0000FF, B: #FF0000। সারি এক, কলাম এক থেকে তিন হল A. সারি এক, কলাম চার হল B. সারি দুই, কলাম এক থেকে তিন হল A. সারি দুই, কলাম চার হল B।
সেই সংরক্ষিত বাইটের দুর্ভাগ্যজনক শেষ ফলাফল হল আপনি পিক্সেল-পরিপূর্ণতা হারিয়েছেন।
অবশ্যই, আপনি, রেন্ডারিং ইঞ্জিন, জানেন না যে আমি কীভাবে আমার উত্স চিত্রকে এনকোড করেছি তার থেকে গাঢ় নীল পিক্সেলের বিশদটি বাদ দেওয়া হয়েছে৷ আপনি ইমেজটিকে রেন্ডার করেছেন ঠিক যেমনটি আমি এনকোড করেছি, আমাদের হাতে থাকা রঙগুলি সম্পর্কে আমাদের ভাগ করা বোঝার ভিত্তিতে।
এখন, এই অতিরঞ্জিত উদাহরণে, তিনটি রঙ কমিয়ে দুটি করে মানের একটি সুস্পষ্ট পার্থক্য তৈরি করে। একটি বৃহত্তর এবং আরও বিশদ চিত্র জুড়ে প্রভাবগুলি ততটা লক্ষণীয় নাও হতে পারে, তবে সেগুলি এখনও দৃশ্যমান হবে।
যখন একটি GIF হিসাবে এনকোড করা হয়, তখন ছায়ার মতো সূক্ষ্ম গ্রেডিয়েন্টগুলি তাদের আশেপাশের থেকে পৃথক পিক্সেলগুলির সাথে বিচ্ছিন্ন হয়ে যায়:
অনুশীলনে, লসলেস কম্প্রেশন এবং প্যালেট কোয়ান্টাইজেশনের সংমিশ্রণ মানে হল যে GIF আধুনিক ওয়েব ডেভেলপমেন্টে খুব বেশি কার্যকর নয়। লসলেস কম্প্রেশন ফাইলের আকার কমাতে যথেষ্ট কাজ করে না, এবং একটি হ্রাস প্যালেট মানে গুণমানের একটি সুস্পষ্ট হ্রাস।
পরিশেষে, GIF হল সাধারণ চিত্রগুলিকে এনকোড করার জন্য একটি কার্যকর বিন্যাস যা ইতিমধ্যেই সীমিত রঙের প্যালেট ব্যবহার করে, অ্যান্টি-আলিয়াসিংয়ের পরিবর্তে শক্ত প্রান্ত এবং গ্রেডিয়েন্টের পরিবর্তে কঠিন রঙগুলি ব্যবহার করে—সব ক্ষেত্রেই অন্যান্য ফর্ম্যাটগুলির দ্বারা আরও ভাল পরিবেশন করা হয়। ছোট এবং আরও বৈশিষ্ট্যযুক্ত PNG প্রায়শই রাস্টার চিত্রগুলির জন্য একটি ভাল পছন্দ, যদিও উভয়ই ফাইলের আকার এবং আইকন বা লাইন আর্টের মতো ব্যবহারের ক্ষেত্রে SVG-এর থেকে অনেক নিকৃষ্ট, যেখানে ভেক্টর উজ্জ্বল হয়। জিআইএফ-এর জন্য সবচেয়ে বেশি দেখা যায় আধুনিক ব্যবহারের ক্ষেত্রে অ্যানিমেশন, তবে সেই উদ্দেশ্যটি পরিবেশন করার জন্য অনেক বেশি দক্ষ-এবং অ্যাক্সেসযোগ্য-আধুনিক ভিডিও ফর্ম্যাট রয়েছে।