ابزارهای کد QR

ساخت کد 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) می‌خواهد: حاشیه‌ای سفید به پهنای چهار ماژول دور تا دور کد. آزمایش‌های ما نشان می‌دهد این حاشیه از آنچه به نظر می‌رسد مهم‌تر است.

محتوای بلندتر یعنی کد فشرده‌تر

هرچه نویسه‌های بیشتری در کد بگذارید و سطح تصحیح خطای بالاتری انتخاب کنید، کد به ماژول‌های بیشتری نیاز دارد. چهار محتوای رایج را کدگذاری کردیم:

تعداد ماژول در هر ضلع، بدون ناحیه‌ی خالی. ساخته‌شده با کتابخانه‌ی qrcode-generator که ابزار ما از آن استفاده می‌کند (انتخاب خودکار نسخه، حالت بایت).
محتوانویسهLMQH
نشانی صفحه‌ی اصلی (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 بسازید و نتیجه را آزمایش کنید.

کنتراست و رنگ

روی تصویرهای دیجیتال تمیز، هر دو رمزگشا حتی کدهای بسیار کم‌رنگ را هم خواندند. عکس دوربین فرق دارد؛ برای همین نویز حسگر، کمی تاری و نوری که در عرض کد تا ۶۵٪ کم می‌شود اضافه کردیم و هر آزمایش را ده بار تکرار کردیم:

کنتراست = ماژول‌ها چقدر از پس‌زمینه تیره‌ترند.
مقدار خاکستری ماژول‌های تیرهکنتراست با پس‌زمینه‌ی سفیدZBarOpenCV
۰ (سیاه)۱۰۰٪۱۰ از ۱۰۸ از ۱۰
۶۴۷۵٪۱۰ از ۱۰۱۰ از ۱۰
۹۶۶۲٪۷ از ۱۰۷ از ۱۰
۱۲۸۵۰٪۱ از ۱۰۹ از ۱۰
۱۶۰۳۷٪۰ از ۱۰۹ از ۱۰
۱۹۲۲۵٪۰ از ۱۰۰ از ۱۰

ماژول‌های تیره را واقعاً تیره نگه دارید: حدود ۷۵٪ تیره‌تر از پس‌زمینه برای هر دو رمزگشا مطمئن بود. آنچه اهمیت دارد روشنایی است، نه رنگ. سرمه‌ای یا سیاه روی سفید ایده‌آل است؛ قرمز خالص روی سفید فقط حدود ۶۶٪ تیره‌تر و در مرز خطر است؛ آبی روشن (حدود ۳۳٪) و زرد (حدود ۲۱٪) روی سفید مناسب نیستند.

ناحیه‌ی خالی اختیاری نیست

کدها را روی یک الگوی شلوغ سیاه‌وسفید گذاشتیم، با حاشیه‌ی خالی ۰، ۱، ۲ یا ۴ ماژولی، هر کدام روی ده پس‌زمینه‌ی تصادفی متفاوت:

ناحیه‌ی خالیZBarOpenCV
۰ ماژول۸ از ۱۰۰ از ۱۰
۱ ماژول۱۰ از ۱۰۱۰ از ۱۰
۲ ماژول۱۰ از ۱۰۹ از ۱۰
۴ ماژول (استاندارد)۱۰ از ۱۰۱۰ از ۱۰

بدون هیچ حاشیه‌ای، OpenCV هر بار شکست خورد. سازنده‌ی ما همیشه حاشیه‌ی استاندارد چهار ماژولی را اضافه می‌کند. آن را در صفحه‌آرایی برش ندهید و متن، عکس و طرح را از آن دور نگه دارید.

کدهای ایستا هیچ‌وقت منقضی نمی‌شوند

سازنده‌ی ما کدهای ایستا (static) می‌سازد: خودِ محتوا، مثل نشانی وب، اطلاعات وای‌فای یا نشانی ایمیل، در نقش کد ذخیره می‌شود و کد بدون هیچ سرویسی برای همیشه کار می‌کند. کدهای به‌اصطلاح پویا (dynamic) که برخی شرکت‌ها می‌فروشند فقط یک لینک کوتاه به خود آن شرکت دارند که بازدیدکننده را هدایت می‌کند؛ اگر اشتراک تمام شود، همه‌ی کدهای چاپ‌شده از کار می‌افتند. برای چاپ، یک کد ایستا که به نشانی‌ای روی دامنه‌ی خودتان اشاره می‌کند هر دو مزیت را دارد: منقضی نمی‌شود و مقصدش را می‌توانید با یک ریدایرکت در سایت خودتان عوض کنید.

امنیت: با احتیاط اسکن کنید

هیچ‌کس نمی‌تواند کد QR را با چشم بخواند و همین آن را برای پنهان کردن لینک مخرب ایده‌آل می‌کند. کمیسیون تجارت فدرال آمریکا (FTC) در دسامبر ۲۰۲۳ هشدار داد که کلاهبرداران کدهای خودشان را روی کدهای واقعی می‌چسبانند، مثلاً روی پارکومترها، و کدها را با پیام‌های فوری از طریق ایمیل و پیامک می‌فرستند. پیش از باز کردن لینکی که اسکن کرده‌اید، نشانی‌ای را که گوشی نشان می‌دهد بررسی کنید؛ کدهای پیام‌های غیرمنتظره را اسکن نکنید؛ و هرازگاهی مطمئن شوید کسی روی کدهای چاپی خودتان برچسب دیگری نچسبانده است.

ساخت کد QRبرای لینک، متن، وای‌فای و ایمیل کد QR بسازید. رنگ و سطح تصحیح خطا را انتخاب و به‌صورت PNG یا SVG دانلود کنید. رایگان، بدون ثبت‌نام و بدون ردیابی.باز کردن ابزار

چک‌لیست پیش از چاپ

  • محتوا تا حد ممکن کوتاه است و پارامتر ردیابی غیرضروری ندارد.
  • سطح M برای کاربرد معمولی؛ Q یا H برای فضای باز، سطح خمیده یا زبر یا کد با لوگو.
  • ماژول‌های تیره روی زمینه‌ی روشن با کنتراست زیاد، هرگز معکوس.
  • ناحیه‌ی خالی چهار ماژولی کامل و خالی از متن و تصویر است.
  • SVG برای چاپ، چون بدون تار شدن بزرگ می‌شود؛ PNG برای صفحه‌نمایش و اسناد.
  • یک خط متن کوتاه کنار کد می‌گوید کد به کجا می‌رود؛ مثلاً «منو: example.com/menu».
  • نمونه‌ی چاپی با دست‌کم دو گوشی مختلف، از فاصله‌ی واقعی و در نور واقعی آزمایش شده است.

ابزارهای این راهنما

پرسش‌های متداول

کدام سطح تصحیح خطا را انتخاب کنم؟

سطح M برای بیشتر کدهای روی کاغذ و صفحه‌نمایش مناسب است. برای کد در فضای باز، روی سطح خمیده یا زبر یا کد با لوگو Q یا H را انتخاب کنید و L را فقط برای محتوای خیلی طولانی که روی صفحه‌نمایش نشان داده می‌شود.

آیا کد QR منقضی می‌شود؟

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

می‌توانم وسط کد QR لوگو بگذارم؟

بله، با سطح H. در آزمایش ما با سطح H ناحیه‌ای خالی تا ۱۸٪ مساحت کد هنوز خوانده شد و با سطح M فقط ۷٪. لوگو را به‌وضوح زیر ۱۵٪ نگه دارید، گوشه‌ها را آزاد بگذارید و نسخه‌ی چاپی را آزمایش کنید.

چرا کد QR من اسکن نمی‌شود؟

رایج‌ترین دلیل‌ها: کد برای آن فاصله خیلی کوچک یا خیلی فشرده است، کنتراست کم است، رنگ‌ها معکوس‌اند، ناحیه‌ی خالی وجود ندارد، روی جنس براق بازتاب نور هست یا سطح خمیده است، مثل بطری.

آیا رمز وای‌فای در کد QR امن است؟

رمز به‌صورت متن ساده در کد ذخیره می‌شود و هر کس کد را اسکن کند یا از آن عکس بگیرد می‌تواند آن را بخواند. از کد وای‌فای برای شبکه‌ی مهمان استفاده کنید و هر وقت لازم شد رمز را عوض کنید.

آیا هنگام ساختن کد، اطلاعاتم جایی فرستاده می‌شود؟

نه. سازنده‌ی کد QR ما کد را در مرورگر شما می‌سازد و چیزی که وارد می‌کنید به سرور ما فرستاده نمی‌شود.

منابع و مطالعه‌ی بیشتر

  1. ISO/IEC 18004:2024 – QR Code bar code symbology specification (www.iso.org)
  2. KEYENCE: What is a QR code? (versions, error correction, quiet zone) (www.keyence.com)
  3. CNBC: QR codes may be a gateway to identity theft, FTC warns (December 2023) (www.cnbc.com)
همه‌ی راهنماها