ساخت کد QR که همیشه اسکن شود: اندازه، کنتراست و تصحیح خطا
کدهای QR ساختیم، رویشان لوگو گذاشتیم، کنتراستشان را کم کردیم، کوچکشان کردیم و حاشیهشان را برداشتیم و بعد سعی کردیم آنها را بخوانیم. در این راهنما میبینید چه چیزی کد QR را قابلاعتماد میکند و چه چیزی بیسروصدا خرابش میکند.
کد QR روی بروشور، منوی رستوران یا بستهی پستی فقط یک وظیفه دارد: بهمحض اینکه کسی گوشی را رو به آن بگیرد، صفحهی درست را باز کند. اگر کار نکند، کمتر کسی دوباره امتحان میکند. بیشتر خرابیها از چند تصمیم طراحی ساده ناشی میشود و همهی آنها را میتوان پیش از چاپ آزمایش کرد. ما کدها را با همان کتابخانهای ساختیم که ابزار ساخت کد QR از آن استفاده میکند و با دو رمزگشای متنباز، ZBar 0.23 و OpenCV 5.0، خواندیم.
کد QR دادهها را چطور نگه میدارد
کد QR را شرکت ژاپنی Denso Wave در سال ۱۹۹۴ ساخت و در استاندارد ISO/IEC 18004 (آخرین ویرایش ۲۰۲۴) تعریف شده است. این کد از مربعهای کوچکی به نام «ماژول» ساخته شده است. کوچکترین نسخه ۲۱ × ۲۱ ماژول دارد و هر یک از ۴۰ نسخه، چهار ماژول به هر ضلع اضافه میکند تا ۱۷۷ × ۱۷۷. سه مربع بزرگ گوشهها به اسکنر نشان میدهند کد کجاست و چقدر چرخیده است.
بخشی از هر کد اطلاعات اضافه برای تصحیح خطاست (روش Reed–Solomon) تا کد آسیبدیده یا کثیف هم خوانده شود. میزان آن را خودتان انتخاب میکنید:
| سطح | دادهی قابل بازیابی | کاربرد معمول |
|---|---|---|
| L | حدود ۷٪ | صفحهنمایش تمیز، محتوای خیلی طولانی |
| M | حدود ۱۵٪ | تنظیم پیشفرض رایج برای چاپ و صفحهنمایش |
| Q | حدود ۲۵٪ | فضای باز، سطح زبر یا خمیده |
| H | حدود ۳۰٪ | کد با لوگو، شرایط سخت |
استاندارد همچنین یک ناحیهی خالی (quiet zone) میخواهد: حاشیهای سفید به پهنای چهار ماژول دور تا دور کد. آزمایشهای ما نشان میدهد این حاشیه از آنچه به نظر میرسد مهمتر است.
محتوای بلندتر یعنی کد فشردهتر
هرچه نویسههای بیشتری در کد بگذارید و سطح تصحیح خطای بالاتری انتخاب کنید، کد به ماژولهای بیشتری نیاز دارد. چهار محتوای رایج را کدگذاری کردیم:
| محتوا | نویسه | L | M | Q | H |
|---|---|---|---|---|---|
| نشانی صفحهی اصلی (https://omid57.eu/) | ۱۸ | ۲۵ | ۲۵ | ۲۵ | ۲۹ |
| نشانی یک صفحه (…/en-US/tools/qr-code-generator) | ۴۷ | ۲۹ | ۳۳ | ۳۷ | ۴۱ |
| همان نشانی با چهار پارامتر ردیابی UTM | ۱۲۸ | ۴۱ | ۴۹ | ۵۳ | ۶۱ |
| اطلاعات ورود به وایفای (نام شبکه و رمز) | ۵۴ | ۳۳ | ۳۳ | ۳۷ | ۴۱ |
پارامترهای ردیابی، کد سطح M را از ۳۳ به ۴۹ ماژول در هر ضلع رساندند. اگر کد در همان اندازه چاپ شود، هر ماژول حدود ۲۸٪ کوچکتر میشود، چون عرض کد بهجای ۴۱ میان ۵۷ عرض ماژول تقسیم میشود (با احتساب ناحیهی خالی). نشانی کوتاه سادهترین راه برای داشتن کدی مقاوم است.
کد QR چقدر باید بزرگ باشد؟
اینکه کد خوانده شود یا نه به این بستگی دارد که هر ماژول چند پیکسل از تصویر دوربین را بپوشاند. کدها را آنقدر کوچک کردیم که هر ماژول عرض مشخصی بر حسب پیکسل داشته باشد، کمی مثل لنز دوربین تارشان کردیم و سعی کردیم بخوانیمشان:
| پیکسل برای هر ماژول | کد ۲۵ × ۲۵ | کد ۳۳ × ۳۳ | کد ۴۹ × ۴۹ |
|---|---|---|---|
| ۲ | خوانده نشد | خوانده نشد | خوانده نشد |
| ۲٫۵ | فقط ZBar | خوانده نشد | فقط ZBar |
| ۳ | هر دو خواندند | هر دو خواندند | هر دو خواندند |
| ۴ | هر دو خواندند | هر دو خواندند | هر دو خواندند |
هر دو رمزگشا به حدود سه پیکسل برای هر ماژول نیاز داشتند. برای کسی که اسکن میکند، یعنی: اگر ماژولها دو برابر بزرگتر باشند، کد از دو برابر فاصله خوانده میشود و کد فشردهتر را باید از نزدیکتر اسکن کرد. اندازهی ماژول چاپ خود (m) را میتوانید از عرض چاپ (w) و تعداد ماژولهای هر ضلع (n) حساب کنید؛ عدد ۸ همان دو حاشیهی چهار ماژولی است:
m = w ÷ (n + 8)
w = 30 mm, n = 33: 30 ÷ 41 ≈ 0.73 mm
w = 30 mm, n = 49: 30 ÷ 57 ≈ 0.53 mm یعنی کدی به عرض ۳ سانتیمتر با ۳۳ × ۳۳ ماژول، ماژولهایی حدود ۰٫۷۳ میلیمتری دارد و با ۴۹ × ۴۹ ماژول فقط حدود ۰٫۵۳ میلیمتری. هر اندازهای که انتخاب کنید، یک نمونه چاپ کنید و از همان فاصلهای اسکنش کنید که مردم واقعاً میایستند؛ مثلاً آن طرف میز یا از پیادهروی جلوی ویترین مغازه.
لوگو: چقدر از کد را میشود پوشاند؟
تصحیح خطا باعث میشود کد آسیب را تحمل کند؛ به همین دلیل بسیاری از طرحها لوگویی وسط کد میگذارند. وسط کدِ نشانی ۴۷ نویسهای را با مربع سفیدی پوشاندیم که مدام بزرگتر میشد و بررسی کردیم خواندن از کجا شکست میخورد:
| سطح | دادهی قابل بازیابی | بزرگترین ناحیهی مرکزی که کد هنوز خوانده شد |
|---|---|---|
| L | حدود ۷٪ | ۳٪ مساحت کد |
| M | حدود ۱۵٪ | ۷٪ |
| Q | حدود ۲۵٪ | ۱۲٪ (OpenCV: ۱۵٪) |
| H | حدود ۳۰٪ | ۱۸٪ |
در عمل فقط نصف تا دوسوم مقدار اسمی را میتوان پوشاند: لوگو بخشی از واژههای کد را هم ناقص میکند و مقدار اسمی بهترین حالت است. اگر لوگو اضافه میکنید، سطح H را انتخاب کنید، لوگو را بهوضوح زیر ۱۵٪ مساحت نگه دارید و به سه مربع گوشه دست نزنید. سازندهی ما لوگو اضافه نمیکند؛ اگر لوگو را در یک ویرایشگر تصویر میگذارید، کد را با سطح H بسازید و نتیجه را آزمایش کنید.
کنتراست و رنگ
روی تصویرهای دیجیتال تمیز، هر دو رمزگشا حتی کدهای بسیار کمرنگ را هم خواندند. عکس دوربین فرق دارد؛ برای همین نویز حسگر، کمی تاری و نوری که در عرض کد تا ۶۵٪ کم میشود اضافه کردیم و هر آزمایش را ده بار تکرار کردیم:
| مقدار خاکستری ماژولهای تیره | کنتراست با پسزمینهی سفید | ZBar | OpenCV |
|---|---|---|---|
| ۰ (سیاه) | ۱۰۰٪ | ۱۰ از ۱۰ | ۸ از ۱۰ |
| ۶۴ | ۷۵٪ | ۱۰ از ۱۰ | ۱۰ از ۱۰ |
| ۹۶ | ۶۲٪ | ۷ از ۱۰ | ۷ از ۱۰ |
| ۱۲۸ | ۵۰٪ | ۱ از ۱۰ | ۹ از ۱۰ |
| ۱۶۰ | ۳۷٪ | ۰ از ۱۰ | ۹ از ۱۰ |
| ۱۹۲ | ۲۵٪ | ۰ از ۱۰ | ۰ از ۱۰ |
ماژولهای تیره را واقعاً تیره نگه دارید: حدود ۷۵٪ تیرهتر از پسزمینه برای هر دو رمزگشا مطمئن بود. آنچه اهمیت دارد روشنایی است، نه رنگ. سرمهای یا سیاه روی سفید ایدهآل است؛ قرمز خالص روی سفید فقط حدود ۶۶٪ تیرهتر و در مرز خطر است؛ آبی روشن (حدود ۳۳٪) و زرد (حدود ۲۱٪) روی سفید مناسب نیستند.
ناحیهی خالی اختیاری نیست
کدها را روی یک الگوی شلوغ سیاهوسفید گذاشتیم، با حاشیهی خالی ۰، ۱، ۲ یا ۴ ماژولی، هر کدام روی ده پسزمینهی تصادفی متفاوت:
| ناحیهی خالی | ZBar | OpenCV |
|---|---|---|
| ۰ ماژول | ۸ از ۱۰ | ۰ از ۱۰ |
| ۱ ماژول | ۱۰ از ۱۰ | ۱۰ از ۱۰ |
| ۲ ماژول | ۱۰ از ۱۰ | ۹ از ۱۰ |
| ۴ ماژول (استاندارد) | ۱۰ از ۱۰ | ۱۰ از ۱۰ |
بدون هیچ حاشیهای، OpenCV هر بار شکست خورد. سازندهی ما همیشه حاشیهی استاندارد چهار ماژولی را اضافه میکند. آن را در صفحهآرایی برش ندهید و متن، عکس و طرح را از آن دور نگه دارید.
کدهای ایستا هیچوقت منقضی نمیشوند
سازندهی ما کدهای ایستا (static) میسازد: خودِ محتوا، مثل نشانی وب، اطلاعات وایفای یا نشانی ایمیل، در نقش کد ذخیره میشود و کد بدون هیچ سرویسی برای همیشه کار میکند. کدهای بهاصطلاح پویا (dynamic) که برخی شرکتها میفروشند فقط یک لینک کوتاه به خود آن شرکت دارند که بازدیدکننده را هدایت میکند؛ اگر اشتراک تمام شود، همهی کدهای چاپشده از کار میافتند. برای چاپ، یک کد ایستا که به نشانیای روی دامنهی خودتان اشاره میکند هر دو مزیت را دارد: منقضی نمیشود و مقصدش را میتوانید با یک ریدایرکت در سایت خودتان عوض کنید.
امنیت: با احتیاط اسکن کنید
هیچکس نمیتواند کد QR را با چشم بخواند و همین آن را برای پنهان کردن لینک مخرب ایدهآل میکند. کمیسیون تجارت فدرال آمریکا (FTC) در دسامبر ۲۰۲۳ هشدار داد که کلاهبرداران کدهای خودشان را روی کدهای واقعی میچسبانند، مثلاً روی پارکومترها، و کدها را با پیامهای فوری از طریق ایمیل و پیامک میفرستند. پیش از باز کردن لینکی که اسکن کردهاید، نشانیای را که گوشی نشان میدهد بررسی کنید؛ کدهای پیامهای غیرمنتظره را اسکن نکنید؛ و هرازگاهی مطمئن شوید کسی روی کدهای چاپی خودتان برچسب دیگری نچسبانده است.
چکلیست پیش از چاپ
- محتوا تا حد ممکن کوتاه است و پارامتر ردیابی غیرضروری ندارد.
- سطح M برای کاربرد معمولی؛ Q یا H برای فضای باز، سطح خمیده یا زبر یا کد با لوگو.
- ماژولهای تیره روی زمینهی روشن با کنتراست زیاد، هرگز معکوس.
- ناحیهی خالی چهار ماژولی کامل و خالی از متن و تصویر است.
- SVG برای چاپ، چون بدون تار شدن بزرگ میشود؛ PNG برای صفحهنمایش و اسناد.
- یک خط متن کوتاه کنار کد میگوید کد به کجا میرود؛ مثلاً «منو: example.com/menu».
- نمونهی چاپی با دستکم دو گوشی مختلف، از فاصلهی واقعی و در نور واقعی آزمایش شده است.
ابزارهای این راهنما
پرسشهای متداول
کدام سطح تصحیح خطا را انتخاب کنم؟
سطح M برای بیشتر کدهای روی کاغذ و صفحهنمایش مناسب است. برای کد در فضای باز، روی سطح خمیده یا زبر یا کد با لوگو Q یا H را انتخاب کنید و L را فقط برای محتوای خیلی طولانی که روی صفحهنمایش نشان داده میشود.
آیا کد QR منقضی میشود؟
کدهای ایستا، مثل کدهای سازندهی ما، هرگز منقضی نمیشوند، چون محتوا در خود کد است. کدهای پویای برخی سرویسها به آن سرویس وابستهاند و اگر سرویس تعطیل شود یا اشتراک تمام شود، از کار میافتند.
میتوانم وسط کد QR لوگو بگذارم؟
بله، با سطح H. در آزمایش ما با سطح H ناحیهای خالی تا ۱۸٪ مساحت کد هنوز خوانده شد و با سطح M فقط ۷٪. لوگو را بهوضوح زیر ۱۵٪ نگه دارید، گوشهها را آزاد بگذارید و نسخهی چاپی را آزمایش کنید.
چرا کد QR من اسکن نمیشود؟
رایجترین دلیلها: کد برای آن فاصله خیلی کوچک یا خیلی فشرده است، کنتراست کم است، رنگها معکوساند، ناحیهی خالی وجود ندارد، روی جنس براق بازتاب نور هست یا سطح خمیده است، مثل بطری.
آیا رمز وایفای در کد QR امن است؟
رمز بهصورت متن ساده در کد ذخیره میشود و هر کس کد را اسکن کند یا از آن عکس بگیرد میتواند آن را بخواند. از کد وایفای برای شبکهی مهمان استفاده کنید و هر وقت لازم شد رمز را عوض کنید.
آیا هنگام ساختن کد، اطلاعاتم جایی فرستاده میشود؟
نه. سازندهی کد QR ما کد را در مرورگر شما میسازد و چیزی که وارد میکنید به سرور ما فرستاده نمیشود.