بارکد اسکنر

نوشته حسین بهنودی در ۱۵ آذر ۱۳۹۸

بارکد اسکنر یا بارکدخوان به دستگاهی می‌گویند که  بارکد چاپ شده را می‌خواند، و دیتای موجود در آن را رمزگشایی می‌کند.

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

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

ZXing (کوتاه‌شدهٔ Zebra Crossing به فارسی: خط‌کشی عابر پیاده) نام یک کتابخانه پردازش تصویر بارکد یک‌بعدی و دوبعدی است. این پروژه اپن سورس و آزاد است. با اینکه به زبان جاوا پیاده‌سازی شده، امکان استفاده در برخی زبان‌های دیگر را نیز دارد.


در مثال زیر از کتابخانه ZXing استفاده شده است. این مثال نحوه اسکن بارکد یک‌بعدی و دوبعدی را از دوربین فیلم برداری نشان می‌دهد. اگر بیش از یک دوربین در دسترس باشد (به عنوان مثال دوربین جلو و پشت) می‌توانید آن را انتخاب کنید.

HTML

<button id="start-btn">Start</button>
<button id="stop-btn">Stop</button>
<video id="video" width="320" height="180"></video>
<select id="src-select"></select>
<pre id="out-box"></pre>

JS

window.addEventListener('load', function () {
  const startBtn = document.getElementById('start-btn');
  const stopBtn = document.getElementById('stop-btn');
  const srcSelect = document.getElementById('src-select');
  const outBox = document.getElementById('out-box');

  let selectedDeviceId;
  const codeReader = new ZXing.BrowserMultiFormatReader();
  codeReader.listVideoInputDevices()
    .then((videoInputDevices) => {
      selectedDeviceId = videoInputDevices[0].deviceId;
      if (videoInputDevices.length >= 1) {
        videoInputDevices.forEach((element) => {
          const srcOption = document.createElement('option');
          srcOption.text = element.label;
          srcOption.value = element.deviceId;
          srcSelect.appendChild(srcOption);
        })

        srcSelect.onchange = () => {
          selectedDeviceId = srcSelect.value;
        };
      }

      startBtn.addEventListener('click', () => {
        codeReader.decodeFromVideoDevice(selectedDeviceId, 'video', (result, err) => {
          if (result) {
            outBox.textContent = result.text;
          }
          if (err && !(err instanceof ZXing.NotFoundException)) {
            outBox.textContent = err;
          }
        })
      })

      stopBtn.addEventListener('click', () => {
        codeReader.reset();
        outBox.textContent = '';
      })

    })
    .catch((err) => {
      console.error(err);
    })
})