Можно ли распечатать qr-код в mfc

Обновлено: 21.11.2024

Эта статья посвящена использованию библиотеки Python: qrtools. Эту библиотеку можно использовать как для чтения QR-кодов, так и для их создания.

Что такое QR-коды?

QR-код или код быстрого ответа – это товарный знак двумерного штрих-кода. Двухмерные штрих-коды аналогичны одномерным штрих-кодам, но могут хранить больше информации на единицу площади.

    Debian Linux: qrtools можно установить в системах Linux на основе Debian с помощью следующих команд

Также должны быть установлены следующие зависимости

Создать QR-код

  1. данные
  2. размер_пикселя
  3. уровень
  4. margin_size
  5. тип_данных

Чтобы создать QR-код с настройками по умолчанию, мы должны просто указать данные при создании объекта. Обратите внимание, что данные должны быть объектом Unicode, если будут использоваться объекты, отличные от ASCII.

Если программа запускается успешно, она возвращает значение 0, а QR-код сохраняется в папке tmp. Чтобы узнать точное местоположение, используйте следующую команду

Пример вывода

Теперь этот файл можно переместить в другую папку, как нам удобно

Значение пикселя QR-кода также можно изменить, указав значение во время создания объекта QR. Размер по умолчанию, как правило, немного мал для чтения с помощью сканеров на смартфонах, поэтому размер около 10 был бы идеальным для таких целей, например:

Приведенный ниже QR-код имеет размер 10 пикселей и закодирован с помощью URL

Мы также можем добавить данные электронной почты, данные SMS, данные MMS, закладки и т. д. в QR-код. Следующий фрагмент кода взят из исходного кода, в котором указаны различные типы данных, которые можно использовать, а также формат данных, которые потребуются для его использования:

В приведенном выше коде мы видим различные типы данных, которые можно назначать и использовать при создании QR-кодов. Например, чтобы использовать закладку в качестве данных, мы должны предоставить данные в виде списка, состоящего из заголовка и URL-адреса. Для этого мы должны сделать следующее

Прочитать QR-код

Сканировать и читать QR-код относительно просто. При создании QR-объекта мы должны просто указать путь к QR-коду в качестве аргумента. Предположим, мы пытаемся расшифровать QR-код, созданный в начале статьи.

Вывод:

Мы также можем распечатать значения других параметров, переданных при создании объекта QR, для генерации QR-кода, например, используя тот же QR-код, сгенерированный в начале статьи, дополнительное добавление этих операторов печати даст следующее дополнительный вывод

Вывод:

Пожалуйста, напишите комментарии, если обнаружите что-то неправильное или хотите поделиться дополнительной информацией по теме, обсуждавшейся выше.

Сгенерируйте QR-код и запишите его в масштабированном формате PNG на C++

❗ Этому посту больше года. Возможно, он уже не актуален. Возможно, мнения изменились.

Содержание

Мост между двумя замечательными библиотеками, QR-Code-Generator и Tiny-PNG-Out.

Библиотека QR-Code-Generator от Project Nayuki для C++ предоставляет простой, быстрый и правильный способ создания QR-кодов. Однако вы получаете только структуру данных, показывающую, что данные зависят от вас. Приведен пример для печати кода на терминале, но не для создания фактического файла изображения. Для Java приведен пример, который записывает файл PNG, но не для C++.

У автора библиотеки также есть другая библиотека C++, Tiny-PNG-Out. Это верно до 700-мегапиксельных файлов PNG, которые, я надеюсь, ваш QR-код никогда не сработает.

Я написал класс, который соединяет их вместе, позволяя вам сгенерировать QR-код и записать его в файл PNG с максимально возможным масштабированием.

[Если вам нравится этот курс, подумайте о том, чтобы спонсировать меня, попробовав VPS Digital Ocean. По этой ссылке вы получите кредит в размере 100 долларов США на 60 дней). (реферальная ссылка)][99]

Код прост и содержит комментарии, объясняющие, почему что-то происходит. Его легко адаптировать и интегрировать в собственный проект, так как он не требует никаких внешних зависимостей (таких как qrencode или libpng), что в моем случае полезно из-за ограничений по размеру на встраиваемой платформе.

С уважением, вся тяжелая работа выполняется двумя библиотеками, а мой класс — это просто средство для удобства, которое вы могли бы написать сами примерно за час.

Размер увеличен?

QR-код состоит из модулей, также известных как черные и белые точки. Библиотека предоставляет вам структуру данных, в которой каждая точка представляет собой либо 1, либо 0 (черный/белый). Также предоставляется размер всего QR-кода.

Вы можете масштабировать их до более крупных пикселей, если это необходимо. Поскольку мы записываем его в файл PNG с помощью библиотеки Tiny PNG Out, мы можем просто передать данные qr и размер (ширину/высоту) и покончить с этим. В результате получилось бы маленькое, вероятно, несканируемое изображение:

Чтобы убедиться, что код читаем, я подсчитываю, сколько раз код умещается в пределах требуемого размера изображения. Если QR-код сообщает, что его размер равен 23, это означает, что в контексте нашей библиотеки png мы должны записать 23 модуля в виде одной строки пикселей, а затем начать новую строку. Но если вы запросили изображение размером 600 x 600 пикселей, оно будет слишком маленьким.

Поэтому модули масштабируются до размера изображения. Таким образом, если вы запросили изображение размером 90x90 пикселей, а код qr сообщает о размере 29, оно трижды уместится в пределах 90 пикселей. Результирующее изображение будет размером 87 x 87 пикселей с размером модуля qr, равным 3 (каждая черная/белая точка имеет высоту/ширину 3 пикселя).

Вы можете указать минимальный размер модуля в пикселях. Если вы хотите закодировать небольшой код, но хотите, чтобы пиксели были, скажем, шириной не менее 2 пикселей для лучшей читаемости, вы можете обратиться к классу. Если он может масштабироваться, он запишет файл, в противном случае он вернет false.

QR-код записывается построчно, чтобы избежать предварительного построения большого вектора . Это вызывает больше операций ввода-вывода. Если вы хотите изменить его, это довольно легко. При создании QR-кода размером 20148 x 20148 использование ОЗУ составляло около 2 ГБ при создании всего изображения, а затем при его записи, но не более 5 МБ при записи построчно.

Инструкции по сборке

Клонируйте этот репозиторий git. Вы получаете оба проекта.

Создайте папку сборки:

Двоичный файл, который записывает файлы примеров, находится в папке src/:

При его запуске должно быть сгенерировано 3 примера QR-кода:

Однако встроенная версия этой программы не очень полезна, дело в самом коде.

Примеры

В src/main.cpp вы найдете 4 примера использования класса. Вот один пример:

Для печати QRCode в приложении VC++ вам потребуется шрифт Barcodesoft BCSQRCode true type и cruflbcs.dll.

Если вы загрузите и установите демо-версию программного обеспечения Barcodesoft QRCode на свой компьютер, вы найдете crUFLBCS.dll в папке
"C:\Program Files (x86)\Common Files\Barcodesoft\Fontutil\".< /p>

Если вы не нашли файл cruflbcs.dll на своем компьютере, загрузите его с QRCode VC++.

crUFLBCS.dll — это COM-объект с интерфейсом IQRCode.
Подробную информацию об интерфейсе IQRCode можно найти в файле readme.html.

Для вызова методов интерфейса IQRCode из VC++ вы можете использовать Late Binding или Early Binding.

Поздняя привязка используется, когда информация о типе объекта недоступна во время компиляции.

Раннее связывание требует, чтобы клиент получил доступ к библиотеке типов перед компиляцией.

Поздняя привязка

Ваши коды для создания QRCode работают медленнее, чем при раннем связывании.

Однако ваши коды не зависят от версии, если COM-интерфейс и параметры метода остаются неизменными.
CoInitialize(NULL);
CLSID clsid;
if (FAILED(::CLSIDFromProgID(L"cruflbcs.QRCode.1", &clsid)))
return 0;
IDispatch* pIDispatch = NULL;
if (FAILED(::CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**)&pIDispatch))
return 0;
LPOLESTR szNameEncode = L"Кодировать";
DISPID dispid_encode;
HRESULT hr = pIDispatch->GetIDsOfNames(IID_NULL, &szNameEncode, 1, LOCALE_SYSTEM_DEFAULT, &dispid_encode);
CComBSTR bstrResult;
ВАРИАНТАРГ v[1];
v[0].vt = VT_BSTR; v[0].bstrVal = SysAllocString(L"Образец Barcodesoft");
DISPPARAMS dispParams = < v, NULL, 1, 0 >;
ВАРИАНТ vResult;
hr = pIDispatch->Invoke( dispid_encode, IID_NULL, GetUserDefaultLCID(), DISPATCH_METHOD, &dispParams, &vResult, NULL, NULL);
if (FAILED(hr))
return 0;
pIDispatch->Release();
CoUninitialize();

Раннее связывание

Ваши коды для создания QRCode в приложении VC++ работают быстрее, чем при использовании позднего связывания.

<р>1. Библиотека типов импорта. Не забудьте вызвать CoInitialize() перед использованием COM-интерфейса.

<р>2. Если вы хотите использовать макрос T2OLE для преобразования LPTSTR в LPOLESTR, вам нужно сначала вызвать макрос USES_CONVERSION.

<р>3.Вы можете либо вызвать метод Encode, либо метод EncodeCR для кодирования QRCode с параметрами.

Использование MFC для создания класса-оболочки

Если вы используете VC++ 6 для создания QRCode, нажмите Ctrl + W, чтобы запустить мастер классов. Затем нажмите кнопку «Добавить класс», выберите «Из библиотеки типов».
Выберите crUFLBCS.dll, затем выберите все интерфейсы, которые вы хотите добавить оболочки, и нажмите OK.

Если вы используете Visual Studio 2003 или более позднюю версию для создания QRCode,
1. В меню Проект выберите Добавить класс.
2. Выберите класс MFC из Typelib из списка шаблонов.
3. Для Добавить класс из выберите Реестр.
4. В списке доступных библиотек типов найдите crUFLBCS.
5. Из списка интерфейсов в этой библиотеке типов выберите все классы, для которых вы хотите добавить оболочки.
6. Нажмите Готово.

Не забудьте вызвать OleInitialize(NULL) перед использованием следующего фрагмента кода для создания QRCode.

CString strOutput;
IQRCode *pQRCodeObj = new IQRCode();
if ( pQRCodeObj->CreateDispatch("cruflbcs.QRCode.1")
strOutput = pQRCodeObj->Encode("Образец Barcodesoft");

С помощью HoloLens 2 и иммерсивных гарнитур вы можете обнаруживать QR-коды в среде вокруг гарнитуры, устанавливая систему координат в реальном местоположении каждого кода. Вы также можете визуализировать голограммы в одном и том же месте на нескольких устройствах, чтобы создать общий опыт. Как только вы включите веб-камеру на своем устройстве, вы сможете распознавать QR-коды в последних версиях ваших проектов. Чтобы добиться наилучших результатов при запуске рабочей среды, рекомендуем ознакомиться с разделом «Рекомендации».

В этой статье вы узнаете о:

Поддержка устройств

Функция HoloLens 1-го поколения HoloLens 2 Гарнитуры с эффектом погружения
Обнаружение QR-кода ✔️ ✔️

Отслеживание QR-кода с помощью иммерсивных гарнитур Windows Mixed Reality на настольных ПК поддерживается в Windows 10 версии 2004 и выше. Используйте API Microsoft.MixedReality.QRCodeWatcher.IsSupported(), чтобы определить, поддерживается ли функция на текущем устройстве.

Поддерживаемые версии QR-кода

В следующей таблице перечислены поддерживаемые и неподдерживаемые версии QR-кода:

Рекомендации по обнаружению QR-кода

Тихие зоны вокруг QR-кодов

Чтобы правильно читать QR-коды, необходимо оставить поля со всех сторон кода. Это поле не должно содержать печатного содержимого и должно быть шириной четыре модуля (один черный квадрат в коде).

Спецификация QR содержит дополнительную информацию о тихих зонах.

Освещение и фон

Качество обнаружения QR-кода зависит от освещения и фона.

При нормальных условиях освещения обеспечьте достаточную контрастность для черно-белых модулей для повышения производительности.

В экстремальных условиях освещения с ярким освещением или темным фоном вы можете попытаться уменьшить и отрегулировать контрастность, что может повысить скорость обнаружения QR-кода. Белый фон внутри QR-кода можно уменьшить с 255 и ниже.

Размер QR-кодов

Устройства Windows Mixed Reality не работают с QR-кодами со стороной менее 5 см.

Для QR-кодов со сторонами от 5 см до 10 см устройство должно находиться достаточно близко, чтобы обнаружить код. Обнаружение кода может занять больше времени.

Точное время обнаружения кодов зависит не только от размера QR-кодов, но и от того, насколько далеко вы находитесь от кода. Приближение к коду поможет компенсировать проблемы с размером.

Расстояние и угловое положение от QR-кода

Расстояние обнаружения для размера увеличивается линейно, но также зависит от поддерживаемой версии QR или размера модуля. Чем выше версия, тем меньше модули, которые можно обнаружить только с более близкого расстояния. Вы также можете попробовать микро-QR-коды, если хотите, чтобы расстояние обнаружения было больше. Обнаружение QR работает с диапазоном углов += 45 градусов, чтобы обеспечить правильное разрешение для обнаружения кода.

Другие аспекты обнаружения:

  • QR-коды на изогнутых поверхностях не поддерживаются.
  • Поддерживается ориентация в плоскости. Вне самолета должно быть
  • Физический размер QR-кода должен иметь модули не менее 2/3 пикселей. Примечание. Более высокие версии QR-кодов будут иметь меньшие модули.

Компромиссное соотношение между расстоянием и размером QR-кода для оптимального обнаружения показано на следующем графике:

Всегда следите за тем, чтобы у вас был достаточный контраст и правильная граница.

Управление данными QR-кода

Устройства Windows Mixed Reality обнаруживают QR-коды на системном уровне в драйвере. При перезагрузке устройства или перезапуске драйвера история обнаруженных QR-кодов очищается. Повторно обнаруженные QR-коды рассматриваются как новые объекты.

Мы рекомендуем настроить ваше приложение таким образом, чтобы оно игнорировало QR-коды старше определенной метки времени, которую можно указать в приложении. API QR Code указывает время последнего обнаружения. Большинство разработчиков приложений используют системное время при запуске приложения для определения времени обнаружения QR-кода.

Данные QR-кода не зависят от приложения. После запуска приложения будет предоставлен список доступных QR-кодов. Разработчик приложения определит, какие QR-коды относятся к этому приложению.

Размещение QR-кода в пространстве

Для получения рекомендаций о том, где и как размещать QR-коды, см. Рекомендации по среде для HoloLens.

Устранение неполадок и часто задаваемые вопросы

Какие возможности необходимы?

Вам потребуется добавить возможность веб-камеры в манифест (флажок в Unity Capabilities). Если вы создаете стандартный проект UWP, он также находится в package.appxmanifest в проекте решения.

Запросите доступ, вызвав следующую функцию:

Статус доступа должен быть (status == QRCodeWatcherAccessStatus::Allowed) .

Если в доступе отказано, функция вернет отказ в доступе при запуске QRTracking .

Этот API следует вызывать перед созданием объекта QRCodeWatcher.

Если вы запускаете проект из Unity, вам также необходимо убедиться, что вы вызываете из потока пользовательского интерфейса. В противном случае API всегда будет возвращать отказ. Дополнительные сведения см. в разделе о классе AppCallbacks в руководстве по Unity.

Дополнительную информацию о настройке проекта для Unity см. в разделе Настройка Unity для Windows Mixed Reality.

Как заставить функцию отслеживания QR-кода работать на устройствах HoloLens 2?

Отслеживание QR-кода в HoloLens 2 выполняется автоматически, и вам потребуется добавить в приложение возможность "веб-камеры".

Где найти файлы подключаемого модуля API?

Все необходимые файлы и документацию можно найти здесь.

Как подготовить UWP для использования Microsoft.MixedReality.QR.QRCodeWatcher?

Используйте пакет NuGet для распаковки необходимых файлов.

Добавьте ссылку на Microsoft.MixedReality.QR.winmd в свой проект и начните использовать API.

Добавьте правильные версии архитектуры подключаемых модулей и используйте их соответствующим образом в сборке.

Как подготовить Unity с помощью Microsoft.MixedReality.QR.QRCodeWatcher?

Используйте NuGet для Unity и укажите указанный выше пакет NuGet.

Как я могу создавать QR-коды?

Если отслеживание QR-кода вообще не работает, что мне делать?

  • Поддерживается ли версия QR-кода? Мы не поддерживаем версии с высокой плотностью, такие как версия 40. Ничего выше версии 10 не гарантируется; версии выше 20 не поддерживаются.
  • Достаточно ли вы близки к QR-коду? Расстояние и угловое положение смотрите по QR-коду.
  • Какое освещение? Существует известная проблема, из-за которой обнаружение становится трудным, когда QR-код находится на темном фоне окружающей среды. Когда есть темный фон, QR-код будет казаться камере размытым из-за высокой контрастности. Дополнительные сведения см. в разделе Освещение и фон.

Какая точность?

При обнаружении в одном кадре ожидается, что размер будет иметь погрешность не более 1 % от фактического размера. Например, 10-сантиметровый код может отличаться от измеренного размера на +/- 1 мм. При непрерывном обнаружении положение кода может смещаться на +/- 2,5 мм. После того, как вы вышли из зоны обнаружения, позиция предыдущего обнаружения зависит от ошибки карты.

Насколько близко мне нужно находиться к QR-коду, чтобы его обнаружить?

Расстояние, очевидно, зависит от размера QR-кода, а также от его версии. Для получения дополнительной информации см. расстояние и угловое положение в QR-коде.

  • В HoloLens 2 для версии 1 QR-кода со сторонами от 5 см до 25 см минимальное расстояние обнаружения составляет от 0,25 до 0,5 метра. Максимальное расстояние, от которого они могут быть обнаружены, составляет от 0,5 м для самого маленького кода до 2 м для более крупного кода.
  • В Windows Mixed Reality эти расстояния для размеров уменьшаются вдвое.
  • Для больших кодов выполните экстраполяцию — расстояние обнаружения для размера увеличивается линейно. Для любого кода меньшего обнаружения просто не произойдет — 4-5 см — это самое маленькое, что мы можем обнаружить.

Почему я не могу читать QR-коды с логотипами?

В настоящее время мы не поддерживаем QR-коды с логотипами.

QR-коды обнаружены, но почему я не получаю данных?

  • Если платформа не может расшифровать QR-код, данных не будет. Вы можете использовать поток и интерпретировать данные, используя код с открытым исходным кодом.
  • Некоторые функции, например добавление структуры, не поддерживаются.

Сохраняются ли QR-коды на уровне пространства или приложения? Мне кажется, это за гранью приложения?

QR-коды сохраняются на системном уровне в сеансе драйвера или сеансе загрузки HoloLens. Дополнительные сведения см. в разделе Управление данными QR-кода.

Как это работает с базовой платформой? Где они сохраняются?

Обнаруженные QR-коды сохраняются драйвером в памяти.

Как выполнить отладку приложения в Visual Studio, если я получаю сообщение об ошибке "Microsoft.MixedReality.QR.pdb не найден"?

Загрузка символов для Microsoft.MixedReality.QR.dll была пропущена, поскольку она не указана в списке включенных модулей.

Чтобы воспроизвести

Следуйте инструкциям, чтобы воспроизвести это поведение:

  1. Установите Microsoft.MixedReality.QR (NuGet) и MRTK
  2. Попробуйте отладить

Вы должны иметь возможность отлаживать приложение с помощью Microsoft.MixedReality.QR.dll, но DLL не найдена:

Рекомендуемое решение

Мы работаем над добавлением символов в следующую версию. Тем временем вы по-прежнему сможете отлаживать свое приложение, исключив dll в параметрах Visual Studio:

Недавно был выпущен OpenCV 4.0 со многими улучшениями и новыми функциями. Одним из них является сканер QR-кода. Мы уже писали о сканере штрих-кода и QR-кода в предыдущем посте, в котором используется внешняя библиотека — ZBar. Итак, мы хотели проверить, как работает сканер OpenCV и лучше ли он сканера Zbar. В этом посте мы увидим, как использовать этот новый сканер QR-кода от OpenCV. Мы также сравним его со сканером на основе ZBar, если вы захотите выбрать, какой из них использовать.

Для запуска кода вам понадобится OpenCV 3.4.4 или 4.0.0 и выше. Если вы хотите выполнить обновление, обратитесь к сообщениям:
OpenCV 3.4.4 в Windows/Ubuntu,
OpenCV 4.0.0 в Windows/Ubuntu

Сканер QR-кода в OpenCV

Если вы хотите получить более подробную информацию о том, что такое QR-код, я бы посоветовал вам посетить Википедию. Давайте просто погрузимся в код для обнаружения QR-кода. Загрузите код по ссылке ниже. Мы также предоставили код для сравнения ZBar и OpenCV QR Code Detector в разделе загрузки.

Загрузить код Чтобы легко следовать этому руководству, загрузите код, нажав кнопку ниже. Это БЕСПЛАТНО!

Код C++

Сначала подключите необходимые заголовочные файлы

Утилита для отображения рамки вокруг обнаруженного QR-кода

В основной функции мы сначала читаем изображение. Затем мы создаем экземпляр объекта QRCodeDetector и используем метод detectAndDecode для поиска данных и местоположения QR-кода. Наконец, мы отображаем результаты.

Код Python

Сначала импортируйте модули

Далее читаем входное изображение, можно указать собственное изображение из командной строки

Утилита для отображения рамки вокруг QR-кода

Создайте объект QRCodeDetector и определите код и его местоположение с помощью метода detectAndDecode.

Вывод

Декодированные данные отображаются на Терминале, а вокруг обнаруженного QR-кода рисуется ограничивающая рамка.

Читайте также: