ساختن QR کدهای عکسدار با dithering
خلاصهٔ کاملتر
یه QR کد دو بخش داره: function patterns (یعنی همون مربعهای درشت گوشهها که اسکنر باهاشون کد رو پیدا میکنه) و data modules (یعنی بقیه خونهها که داده واقعی توشون ذخیره میشه). چون اسکنر اول از الگوهای اصلی جای کد رو پیدا میکنه و بعد سراغ دادهها میره، میشه با data moduleها یه کم بازی کرد. برندها هم از همین برای ساختن QR کدهای خاص استفاده میکنن.
نویسنده از یه QR کد که توی Mastodon دیده شروع میکنه. اونجا هر پیکسل کد به یه شبکه سهدرسه تقسیم شده؛ خونه وسط داده رو نگه میداره و هشت خونه دیگه مال عکسه. اسکنر فقط مرکز هر پیکسل رو نگاه میکنه، پس بقیه فضا آزاده. نتیجه یه عکس یکبیتی و کمکیفیته که روش نویز «نمک و فلفلی» نشسته، چون یکی از هر نه پیکسل عملاً رنگ تصادفی داره.
برای بهتر کردن عکس، نویسنده میره سراغ dithering (یعنی ساختن سایههای میانی با چیدن پیکسلهای سیاه و سفید). روش ساده Bayer یه الگوی شطرنجی منظم میسازه، ولی Floyd-Steinberg بهتره: هر پیکسل رو با آستانه ۵۰٪ سیاه یا سفید میکنی و خطاش رو به پیکسلهای بعدی پخش میکنی. مثلاً پیکسل ۷۰٪ روشن سفید میشه و اون ۳۰٪ روشنایی اضافه از همسایهها کم میشه. الگوی نامنظمش نویز دادهها رو هم کمتر به چشم میاره.
حرکت اصلی مقاله اینه که error diffusion دو مرحلهای انجام بشه. مرحله اول فقط مال data moduleهاست: رنگشون از قبل معلومه، پس همون رنگ رو میگیرن و خطاشون به هشت پیکسل اطراف پخش میشه. این خطا میتونه خیلی بزرگ باشه، مثلاً یه پیکسل سفید وسط یه ناحیه تاریک تا ۹۵٪ خطا داره. نویسنده میگه دقیقاً برای همینه که باید پخشش کرد، نه اینکه نادیدهش گرفت. مرحله دوم هم همون dithering معمولیه و نتیجه خیلی تمیزتر درمیاد.
ابزار ساخت نویسنده اجازه میده کد رو قبل از اضافه کردن عکس بچرخونی و encodingهای دیگه رو امتحان کنی. میتونی بذاری چندتا از data moduleهای پرخطا عوض بشن، چون error correction کد تحملش رو داره (لوگوی وسط QR کدها هم همینطوری کار میکنه). ولی به گفته نویسنده این کار کیفیت عکس رو زیاد بهتر نمیکنه و اسکن رو جدی خراب میکنه.
نویسنده هشدار میده که این کدها برای صفحه بزرگ یا پوستر خوبن، نه برای بروشور کاغذی که ممکنه مچاله بشه. اینکه کد روی گوشی خودت از روی صفحه لپتاپ اسکن میشه، دلیل نمیشه روی گوشی ضعیف یه غریبه، از روی کاغذ و زیر نور بد هم اسکن بشه. خروجی ابزار هم حاشیه نداره؛ باید خودت حاشیه بذاری که رنگش برعکس وسط مربعهای finder باشه، و با CSS جلوی تار شدن عکس موقع بزرگنمایی رو بگیری.
نکات کلیدی:
- هر پیکسل QR کد به شبکه ۳×۳ تقسیم میشه؛ فقط خونه وسط دادهست و ۸ خونه دیگه مال عکسه.
- تصویر نمونه فقط ۱۴۷×۱۴۷ پیکسل و یکبیتیه.
- Floyd-Steinberg خطای هر پیکسل رو به پیکسلهای پردازشنشده اطراف پخش میکنه.
- پخش کردن خطای data moduleها (تا ۹۵٪) قبل از dithering معمولی، نویز رو خیلی کم میکنه.
- عوض کردن data moduleها به کیفیت عکس کمک زیادی نمیکنه ولی اسکن رو خراب میکنه.
- کد نهایی حاشیه لازم داره و برای چاپ روی کاغذی که مچاله میشه مناسب نیست.




