۱۱ آبان ۱۴۰۵ github.com ۳ دقیقه مطالعه

پروژه Nibnib: فشرده‌سازی تصویر با سرعت دکدینگ فوق‌العاده بالا برای سخت‌افزارهای محدود

پروژه Nibnib: فشرده‌سازی تصویر با سرعت دکدینگ فوق‌العاده بالا برای سخت‌افزارهای محدود — Nibnib: Image compression with extreme decompression speed

خلاصه

پروژه Nibnib یک فرمت فشرده‌سازی تصویر است که توسط Raph Levien توسعه یافته و هدف آن دستیابی به سرعت دکدینگ فوق‌العاده بالا در میکروکنترلرهاست. این الگوریتم با نرخ 4bpp و استفاده از یک پالتِ مقدارِ تفاضلی، امکان نمایش تصاویر باکیفیت را در سخت‌افزارهای ضعیف فراهم می‌کند.

معرفی پروژه Nibnib و مسئله‌ای که حل می‌کند

پروژه Nibnib یک فرمت تصویر جدید است که برای دستیابی به سرعت بالای دکدینگ (Decompression) طراحی شده است. این ایده ابتدا به عنوان یک آزمایش برای خروجی DVI روی میکروکنترلر RP2350 شکل گرفت. در دستگاه‌هایی با این رده سخت‌افزاری، بودجه پردازشی برای هر پیکسل بسیار محدود (حدود ۶ سیکل ساعت) است که برای فچ کردن پیکسل، جستجوی پالت و ذخیره در باینر خط کافی است، اما جای زیادی برای کارهای پیچیده باقی نمی‌گذارد.

این فرمت در اصل بر پایه پالت (Palette) کار می‌کند، اما کیفیت آن از تصاویر پالتِ معمولی بالاتر است؛ چرا که پالت به جای رنگ مطلق، یک «تفاضل» (Delta) را ذخیره می‌کند که باعث بهبود چشمگیر نواحی نرم تصویر می‌شود. سرعت بالای دکدینگ با رمزگشایی همزمان دو پیکسل از یک بایت ورودی و دستیابی به فشرده‌سازی 4bpp به دست می‌آید.

سازنده پروژه

توسعه‌دهنده این پروژه Raph Levien است؛ برنامه‌نویس شناخته‌شده‌ای که سابقه فعالیت روی پروژه‌های متن‌باز مهمی در حوزه‌های گرافیک، متن و ابزارهای توسعه نرم‌افزار را در کارنامه دارد.

نحوه کارکرد و معماری فنی

فرآیند دکدینگ در Nibnib بسیار ساده و قطعی (Deterministic) است، در حالی که انکودینگ حالتی نامتقارن دارد و بسیار کندتر از دکدینگ انجام می‌شود.

الگوریتم دکدینگ

رمزگشایی به صورت جفت-پیکسل انجام می‌شود. آخرین پیکسل دکدشده دو برابر می‌شود، سپس یک بایت از جریان ورودی خوانده شده و در پالت جستجو می‌شود. مقدار ۳۲ بیتی حاصل با پیکسل قبلی جمع شده و دو پیکسل با فرمت RGB 565 تولید می‌کند. حلقه داخلی دکودر در زبان Rust بسیار بهینه پیاده‌سازی شده است:

for x in 1..(width / 2) {
    let inp = src[x + 3];
    pix = ((pix >> 16) * 0x10001).wrapping_add(pal[inp as usize]);
    out[x * 2] = pix & 0xffff;
    out[x * 2 + 1] = pix >> 16;
}

انکودر و انتشار خطا

انکودر به جای تبدیل‌های ریاضیِ معکوس‌پذیر (مانند JPEG)، از جستجو در فضای حالت برای یافتن بهترین پالت و کُدِک استفاده می‌کند. این ابزار از تکنیک انتشار خطای Floyd-Steinberg با وزن‌دهی بهره می‌برد تا خطای ایجاد شده در پیکسل‌های زوج‌گانه را به حداقل برساند.

ساختار فایل تصویر نیز بسیار ساده است: ۴ بایت برای عرض و ارتفاع، ۲۵۶ ورودی پالت ۳۲ بیتی، و سپس داده‌های سطر به سطر تصویر.

وضعیت پروژه و سیگنال‌های بلوغ

  • زبان اصلی: Rust
  • مجوز (License): Apache-2.0 / MIT
  • وضعیت فعلی: در زمان بررسی دارای ۱۷ ستاره در GitHub بوده و یک پروژه تجربی و نوپا محسوب می‌شود.

جایگاه در هکرنیوز و مقایسه با گزینه‌های دیگر

این پروژه اخیراً در هکرنیوز توجه برخی از برنامه‌نویسان را به خود جلب کرده است. یکی از کاربران هکرنیوز (wiml) در بخش نظرات اشاره کرده است که این رویکرد تا حدی یادآور حالت ویدئویی قدیمی Amiga HAM است.

در مقایسه با روش‌های سنتی مثل JPEG، انکودینگ در Nibnib بسیار کندتر است و برای کاربردهای آرشیوی طراحی نشده؛ اما مزیت اصلی آن سادگی فوق‌العاده و سرعت پردازش بی‌نظیر دکودر روی تراشه‌های میکروکنترلر است.

در یک نگاه

  • کاربرد اصلی: فشرده‌سازی تصویر با سرعت دکدینگ بسیار بالا برای میکروکنترلرها
  • زبان برنامه‌نویسی: Rust
  • نرخ فشرده‌سازی: 4bpp با استفاده از پالت تفاضلی
  • سازنده: Raph Levien
  • وضعیت مخزن: پروژه نوپا و تجربی با لایسنس دوگانه Apache-2.0 و MIT

این مطلب به‌صورت کاملاً خودکار و با هوش مصنوعی از مقالهٔ اصلی و بحث هکرنیوز تهیه شده و ممکن است خطا داشته باشد. حقوق مطلب اصلی متعلق به نویسندهٔ آن است. قوانین و گزارش مشکل

این خبر را با دیگران به اشتراک بگذارید

خبرهای فناوری در قالب پست و ویدیوی کوتاه، در اینستاگرام هکرنیوز بلاگ. به‌زودی
هر خبر به محض انتشار، به‌همراه پادکست روزانه در کانال تلگرام هکرنیوز بلاگ.