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

عکسهای صفحه از برنامه ها با دکمه های اسکنر بارکد

شرکت هایی مانند Walmart و Amazon از این روش برای جلب مشتری به فروشگاه های آنلاین و آفلاین خود با استفاده از برنامه تلفن خود استفاده کرده اند. شرکت های دیگر مانند Fedex و UPS به مشتریان اجازه می دهند تا کدهای موجود در بسته ها را با استفاده از یک برنامه تلفن اسکن کنند ، نه اینکه نیاز به تایپ دستی لیست های طولانی از نویسه داشته باشند.

اگر کاربران وب سایت تلفن همراه شما نیاز به تایپ کدهای طولانی مانند کدهای فعال سازی دارند یا مایلند محصولات خاص خود را بر اساس شماره مدل چاپ شده در یک مجله یا تبلیغات در وب سایت شما جستجو کنند ، در این صورت شما نیز می توانید از QR استفاده کنید. کدها برای از بین بردن ناامیدی صفحه کلیدهای کوچک و صرفه جویی در آنها برای بررسی مجدد خطاها.

اسکن کد QR با وب سایت تلفن همراه شما

برای اسکن کدهای QR نیازی به برنامه تلفن بومی ندارید. کاملاً ساده است که کد خوان QR خود را ایجاد کنید. وب سایت شما با تلفن هوشمند مجهز به دوربین و کمی جاوا اسکریپت اجرا می شود.

در اینجا یک نسخه ی نمایشی است از یک اسکنر کد QR که نه تنها در تلفن همراه بلکه در اکثر دستگاه های مدرن نیز کار می کند. تمام آنچه شما نیاز دارید دوربین و کد QR برای اسکن است.

اگر کد QR دستی ندارید ، در اینجا یکی از هشت رقم اول Pi را نشان می دهد.

QR Code Reader را تست کنید: کد QR که مقدار Pi را رمزگذاری می کند

ایجاد QR Code Reader

خواننده کد QR ما به برخی از HTML و JavaScript نیاز دارد اما مهمتر از همه ، یک کتابخانه JavaScript با قابلیت تفسیر کد QR است.

ما خودمان نمی خواهیم آن را بسازیم ، زیرا در آنجا کتابخانه های عالی وجود دارد که این کار را برای ما انجام می دهند ، بنابراین نیازی نیست که برای اهداف فعلی خود چرخ را دوباره اختراع کنیم.

بیایید با ایجاد یک شروع کنیم index.html فایل.

افزودن HTML

برای این پروژه به HTML بسیار ساده نیاز داریم. موارد زیر را به برچسب بدن خود اضافه کنید:

<div id="container">
    <h1>QR Code Scanner</h1>

    <a id="btn-scan-qr">
        <img src="https://uploads.sitepoint.com/wp-content/uploads/2017/07/1499401426qr_icon.svg">
    <a/>

    <canvas hidden="" id="qr-canvas"></canvas>

    <div id="qr-result" hidden="">
        <b>Data:</b> <span id="outputData"></span>
    </div>
</div>

<script src="./src/qrCodeScanner.js"></script>

همانطور که مشاهده می کنید ، ما یک ظرف بسته بندی با عنوان داریم ، تصویر آیکون QR در یک بسته بندی شده است a روز ، الف canvas و یک div جایی که ما نتیجه اسکن را نشان خواهیم داد.

بیرون ظرف div ما از جمله qrCodeScanner.js فایل. بعداً ایجاد خواهیم کرد ، اما در ابتدا ظاهر برنامه خود را بهبود خواهیم بخشید.

اضافه کردن سبک ها

صفحه سبک را به بالای HTML ما اضافه کنید:

<link rel="stylesheet" href="src/styles.css" />

اکنون می خواهیم style.css پرونده در src پوشه ما فقط چند سبک اساسی برای این برنامه نمونه می خواهیم. موارد زیر را به پرونده css خود اضافه کنید:

html {
  height: 100%;
}

body {
  font-family: sans-serif;
  padding: 0 10px;
  height: 100%;
  background: black;
  margin: 0;
}

h1 {
  color: white;
  margin: 0;
  padding: 15px;
}

#container {
  text-align: center;
  margin: 0;
}

#qr-canvas {
  margin: auto;
  width: calc(100% - 20px);
  max-width: 400px;
}

#btn-scan-qr {
  cursor: pointer;
}

#btn-scan-qr img {
  height: 10em;
  padding: 15px;
  margin: 15px;
  background: white;
}

#qr-result {
  font-size: 1.2em;
  margin: 20px auto;
  padding: 20px;
  max-width: 700px;
  background-color: white;
}

اصلاً هیچ چیز فانتزی نیست. ما همه چیز را با یک دکمه بزرگ QR در وسط و نتیجه زیر قرار خواهیم داد. ما مانند کدهای QR از سیاه و سفید استفاده می کنیم.

از جمله کتابخانه های وابسته جاوا اسکریپت

راز خواندن کدهای QR ریاضی است و جایگزین ریاضی کتابخانه های منبع باز است. برای خواندن کدهای QR ، ما از پورت جاوا اسکریپت مبتنی بر جاوا کتابخانه پردازش تصویر نوشته شده توسط ZXing. نسخه جاوا اسکریپت توسط Lazar Laszlo منتقل شد.

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

برخی از تغییرات جزئی در کتابخانه

به منظور انطباق پذیری بیشتر کتابخانه ، ما چند تغییر جزئی در عملکرد خروجی کتابخانه اضافه کرده ایم تا بین a موفقیت پاسخ و خطا واکنش.

دو تغییر مهم ایجاد شده در qrcode.js، به این دو خط:

qrcode.result = "error decoding QR Code";

qrcode.callback("Failed to load the image");

این رشته ها با جایگزین شده اند Error اشیاء:

qrcode.result = Error("error decoding QR Code");

qrcode.callback(Error("Failed to load the image"));

اکنون می توانم در عملکرد برگشت پاسخ خود تشخیص دهم که آیا خطایی رخ داده است ، فقط با بررسی اینکه بار بازپرداخت نمونه ای از آن است یا نه Error یا نه.

این تغییرات را می توان در یافت این چنگال کتابخانه

افزودن برچسب اسکریپت

برای استفاده از کتابخانه در کد خوان QR ، ابتدا باید آن را در HTML خود با استفاده از یک برچسب اسکریپت منظم قرار دهیم:

<script src="https://rawgit.com/sitepoint-editors/jsqrcode/master/src/qr_packed.js">
</script>

درمان آن به عنوان یک برنامه

کاری که باید انجام دهیم این است که به مرورگرهای تلفن همراه بگوییم که نمی خواهیم این سایت را در حالت عمودی مقیاس بندی کنیم. این را می توان با اضافه کردن برچسب متای زیر در head عنصر:

<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"/>

افزودن JavScript

اکنون ما نیاز به ایجاد qrCodeReader.js پرونده در src پوشه ، که باید در همان سطح فایل HTML ما باشد.

بیایید چند کد به پرونده جدید خود اضافه کنیم:

const qrcode = window.qrcode;

const video = document.createElement("video");
const canvasElement = document.getElementById("qr-canvas");
const canvas = canvasElement.getContext("2d");

const qrResult = document.getElementById("qr-result");
const outputData = document.getElementById("outputData");
const btnScanQR = document.getElementById("btn-scan-qr");

let scanning = false;

در بالای این بیت کد ، کد را بدست می آوریم qrcode شی از window و آن را به راحتی برای راحتی اختصاص دهید. ما همچنین در حال ایجاد یک video عنصری که ما از آن برای کنترل تصاویر حاصل از دوربین استفاده خواهیم کرد.

سپس ما دریافت می کنیم canvas عنصر و ما از آن برای اختصاص دادن استفاده می کنیم 2d context به یک ثابت ما برای ترسیم تصاویر حاصل از دوربین خود به این نیاز خواهیم داشت.

سپس عناصر مربوطه را برای نشان دادن نتایج و تعامل با برنامه بدست می آوریم و در پایین ، آن را اعلام می کنیم scanning متغیر ، برای حفظ وضعیت اسکنر ما.

در مرحله بعدی ، پاسخ را برای خواننده کد QR تنظیم خواهیم کرد. موارد زیر را در پایین پرونده اضافه کنید:

qrcode.callback = (res) => {
  if (res) {
    outputData.innerText = res;
    scanning = false;

    video.srcObject.getTracks().forEach(track => {
      track.stop();
    });

    qrResult.hidden = false;
    btnScanQR.hidden = false;
    canvasElement.hidden = true;
  }
};

در اینجا ما در حال اختصاص دادن callback عملکرد qrcode هدف – شی. وقتی این کتابخانه یک کد QR را تشخیص می دهد ، این فراخوانی می شود. این فراهم می کند res پارامتر حاوی نتیجه اسکن ، بنابراین ما آن را به innerText خاصیت outputData عنصر

چهار چیز دیگر در اینجا وجود دارد. اول ، ما در حال تنظیم scanning متغیر به کاذب ، از آنجا که پس از رمزگشایی کد QR دیگر نمی خواهیم اسکن کنیم.

سپس ، ما تمام آهنگ ها را از جریان داخل رودخانه دریافت می کنیم srcObjec خاصیت video آنها را یکی یکی متوقف می کند. به این ترتیب است که پخش جریانی دوربین کاربر را متوقف می کنیم.

بلافاصله پس از آن ، ما اطمینان حاصل می کنیم که نمایشگر را نشان می دهیم qrResult عنصر و btnScanQR به این ترتیب کاربر می تواند نتیجه را ببیند و اسکن دیگری را آغاز کند. سرانجام ، ما مخفی می کنیم canvasElement، از آنجا که دیگر نیازی به آن نداریم

این تنها چیزی است که ما برای کنترل پاسخ اسکنر نیاز داریم.

اکنون باید به فید دوربین دسترسی پیدا کرده و یک حلقه تنظیم کنیم تا تصاویر موجود در بوم خود را در هر فریم ترسیم کند. ما همچنین به یک حلقه دیگر برای اسکن کد QR در هر x میلی ثانیه نیاز داریم.

اسکن کردن هر فریم باعث اتلاف منابع می شود ، بنابراین بهتر است که این کار را در یک حلقه جداگانه انجام دهیم که بتوانیم فرکانس اجرای الگوریتم را کنترل کنیم.

ما این کار را در onclick دستیار btnScanQR عنصر:

btnScanQR.onclick = () =>
  navigator.mediaDevices
    .getUserMedia({ video: { facingMode: "environment" } })
    .then(function(stream) {
      scanning = true;
      qrResult.hidden = true;
      btnScanQR.hidden = true;
      canvasElement.hidden = false;
      video.setAttribute("playsinline", true); 
      video.srcObject = stream;
      video.play();
      tick();
      scan();
    });
};

خوب ، اجازه دهید این را مرور کنیم. ما داریم تماس می گیریم getUserMedia تابع از mediaDevices شی ، که بخشی از ناوبری هدف – شی. این باعث می شود مرورگر از کاربر اجازه استفاده از دوربین خود را بگیرد.

getUserMedia تابع یک شی object را به عنوان یک پارامتر در نظر می گیرد که ما در حال انتقال شی object ویدیویی به آن هستیم facingMode تنظیم شده به "environment". اگر کاربر از یک دستگاه تلفن همراه استفاده می کند ، با این کار می توانید دوربین را در پشت خود قرار دهید. این قول را برمی گرداند که اگر حل شود ، جریانی فراهم می کند که بتوانیم به آن اختصاص دهیم srcObject از video عنصری که ایجاد کردیم. سپس ما در حال تنظیم "playsinline" نسبت به true، که از رفتن سافاری iOS به حالت تمام صفحه جلوگیری می کند.

در این مرحله ، ما می توانیم play() ویدئو اما البته این کافی نیست. ما باید جریان را در هر فریم ترسیم کنیم ، بنابراین با آن تماس می گیریم tick عملکرد برای آن منظور و سپس scan تابع برای شروع الگوریتم.

بیایید تعریف کنیم tick تابع:

function tick() {
  canvasElement.height = video.videoHeight;
  canvasElement.width = video.videoWidth;
  canvas.drawImage(video, 0, 0, canvasElement.width, canvasElement.height);

  scanning && requestAnimationFrame(tick);
}

این یک حلقه کلاسیک فریم به فریم است. ما در حال تنظیم ارتفاع و عرض آن هستیم canvasElement به ابعاد video. سپس رسم می کنیم video به canvas و در پایین ما استفاده می کنیم requestAnimationFrame و عبور در tick عملکرد را انجام دهید تا وقتی مرورگر کادر بعدی را ترسیم می کند دوباره فراخوانی شود. ما این کار را به طور شرطی انجام می دهیم scanning متغیر بودن true.

حال بیایید عملکرد اسکن را تعریف کنیم:

function scan() {
  try {
    qrcode.decode();
  } catch (e) {
    setTimeout(scan, 300);
  }
}

اکنون ، این کاملاً ساده است. ما اجرا می کنیم decode تابع از qrcode کتابخانه ، که به دنبال یک canvas با شناسه "qr-canvas" و محتویات آن را اسکن کنید. اگر نتوانیم چیزی پیدا کنیم ، خطایی که تعریف کردیم گرفته می شود و a را فراخوانی می کنیم setTimeout برای اسکن در 300 میلی ثانیه. می توانید این مورد را روی چیز دیگری تنظیم کنید تا ببینید چه اتفاقی می افتد. هرچه بیشتر منتظر اسکن بعدی باشید ، کندتر خواهد بود. هرچه کمتر منتظر بمانید ، از دستگاه کاربر تقاضای بیشتری خواهید داشت ، پس حواستان باشد. سعی کنید به دنبال یک نقطه شیرین باشید.

این همان چیزی است که ما به آن نیاز داریم! حالا بیایید برنامه را امتحان کنیم.

به QR Code Reader در عمل مراجعه کنید

در اینجا پروژه کار در codeandbox وجود دارد. بر روی دکمه QR کلیک کنید و برای اسکن کردن ، چند قطعه کد QR به دوربین نشان دهید. آن را یک لحظه در جای خود نگه دارید و نتیجه خود را خواهید گرفت. از سرعت و روان بودن آن تعجب خواهید کرد.

نتیجه

بنابراین ، ما آن را داریم ، کد خوان QR بسیار اختصاصی شما برای وب سایت تلفن همراه شما. شما همچنین می توانید از هر پلتفرمی استفاده کنید ، که آن را فوق العاده پویا می کند و ارزش زیادی برای مشتریان شما به ارمغان می آورد.

کدهای QR سالهاست که وجود دارد و کد پردازش تصویر نوشته شده توسط ZXing تقریباً نه سال پیش برای اولین بار به JavaScript منتقل شده است. این آزمایش به خوبی امتحان کرده است که هنوز هم یکی از سریع ترین ها باقی مانده است – اگر نه سریعترین – گزینه موجود برای وب. همچنین این یک منبع باز رایگان است ، که حتی باعث بهتر شدن آن می شود.

ما امیدواریم که شما با داشتن چیزی شگفت انگیز لذت ببرید!

دارایی های قابل بارگیری