Сохранение изображения BMP в QR-коде

Я пытаюсь создать (или, если я каким-то образом пропустил это в своем исследовании, найти) алгоритм для кодирования/декодирования изображения bmp в/из формата QR-кода. Я использовал руководство (Thonky), чтобы попытаться понять основы QR. коды, и я до сих пор не уверен, как решить эту проблему, в частности:

  • Должен ли я кодировать данные как двоичные или числовое значение будет более разумным (при условии, что каждый пиксель будет иметь максимальное значение 255)?

  • Я искал информацию о возможностях структурированного добавления QR-кодов, но не нашел подробностей, кроме того факта, что он поддерживается QR-кодами - как я могу реализовать/использовать эту функциональность?

И, конечно же, если есть какие-либо советы/предложения по лучшему хранению изображения в виде двоичных данных, я очень открыт для предложений!

Спасибо за ваше время,

Шон


person user1748532    schedule 15.10.2012    source источник
comment
Я хотел бы спросить, действительно ли вы хотите это сделать. Структурированное добавление не поддерживается практически ни одним читателем, а QR-код максимального размера на практике не читается большинством устройств. Закодируйте простую гиперссылку на изображение.   -  person Sean Owen    schedule 19.10.2012


Ответы (3)


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

Прежде всего, вы, вероятно, захотите сохранить свое изображение в виде необработанных байтов, поскольку другие форматы (числовой и буквенно-цифровой) предназначены для хранения текста/чисел и обеспечат меньше места для хранения вашего изображения. Предположим, вы выбрали максимально возможный QR-код (версия 40) с наименьшим уровнем исправления ошибок, который может содержать до 2953 байт двоичной информации (см. здесь).

Первый вариант, как вы предлагаете, вы сохраняете изображение в виде растрового изображения. Этот формат вообще не допускает сжатия и требует (в случае изображения RGB без альфа-канала) 3 байта на пиксель. Если мы примем во внимание размер заголовка файла (от 14 до 54 байт) и проигнорируем заполнение (каждая строка данных изображения должна быть дополнена до длины, кратной 4), это позволит вам хранить примерно 2900/3 = 966 пикселей. Если рассматривать квадратное изображение, то оно представляет собой растровое изображение размером 31x31, что мало даже для миниатюрного изображения (например, мой аватар в конце этого поста имеет размер 32x32 пикселя).

Второй вариант: вы используете JPEG для кодирования изображения. Этот формат имеет преимущество использования алгоритма сжатия, который может уменьшить размер файла. На этот раз нет точной формулы для получения размера изображения, умещающегося в 2,9 КБ, но я попытался использовать несколько квадратных изображений и уменьшить их размер, пока они не будут соответствовать этому размеру, сохраняя хороший коэффициент качества (93): это дает среднее значение. изображений размером примерно 60x60 пикселей. (На таких маленьких изображениях обычно не наблюдается невероятного коэффициента сжатия между jpeg и bmp, поскольку заголовок файла в файле jpeg намного больше, чем в файле bmp: около 500 байт). Это лучше, чем растровое изображение, но остается довольно маленьким.

Наконец, даже если вам удастся закодировать свое изображение в этом QR-коде, вы столкнетесь с другой проблемой: такой большой QR-код очень и очень сложно успешно отсканировать. Фактически, этот QR-код будет иметь размер 177x177 модулей («модуль» — это маленький белый или черный квадрат). Если вы отсканируете его с помощью смартфона, обеспечивающего так называемые кадры «HD» (1280x720 пикселей), каждый модуль будет иметь максимальный размер кадра около 4 пикселей. Если принять во внимание шум камеры, алиасинг и размытие из-за того, что пользователь никогда не бездействует при сканировании, качество входных кадров очень затруднит успешное получение QR любым алгоритмом декодирования QR-кода. Код (не забудьте, что в начале мы установили низкий уровень исправления ошибок!).

Несмотря на то, что это не очень хорошие новости, я надеюсь, что это поможет вам!

person mbrenon    schedule 17.10.2012
comment
MBrenon, Большое спасибо за ответ. Я не осознавал, с какими ограничениями по размеру я буду работать - я полагаю, что мне нужно проделать некоторую работу с точки зрения возможности сканирования (я не работаю со смартфонами, поэтому самой большой проблемой будет качество входного кадра из-за к используемому носителю) по сравнению с объемом хранимых данных. Имея это в виду, я до сих пор не могу найти никакой информации о функции структурированного добавления QR-кодов - есть ли у вас какие-либо ресурсы, объясняющие, как «связать» QR-коды вместе? Еще раз спасибо за этот вклад, это определенно помогает мне понять проблему, с которой я столкнулся! -Шон - person user1748532; 18.10.2012

Действительно, существует способ закодировать информацию о нескольких (до 16) QR-кодах, используя специальный заголовок в ваших QR-кодах, который называется «Структурированное добавление». Лучшим источником информации, который вы можете использовать, является норма о QR-кодах (ISO 18004:2006); возможно (но не обязательно легко) найти его бесплатно в Интернете.

В соответствующей части (раздел 9) этой нормы сказано:

«До 16 символов QR-кода может быть добавлено в структурированном формате. Если символ является частью сообщения структурированного добавления, он обозначается блоком заголовка в первых трех позициях символов символа. Индикатор режима структурированного добавления 0011 помещается в четыре старших бита в первом символе символа.За этим сразу следуют два кодовых слова структурированного добавления, распределенные по четырем младшим битам первого символа символа, второму символу символа и четырем старшим битам третьего символа символа .Первое кодовое слово является индикатором последовательности символов.Второе кодовое слово представляет собой данные четности и идентично для всех символов в сообщении, что позволяет проверить, что все прочитанные символы являются частью одного и того же сообщения структурированного добавления.За этим заголовком следует сразу кодовыми словами данных для символа, начинающегося с первого индикатора режима».

Тем не менее, я не уверен, что большинство сканеров QR-кода справятся с этим, поскольку это довольно продвинутая функция.

person mbrenon    schedule 19.10.2012

Вы можете определить фиксированный размер изображения, уменьшить части заголовка jpg и использовать только важную информацию о нем, поэтому вы можете сэкономить до 480 байтов обычного заголовка размером ~ 500 байт.

Я использовал этот метод для хранения фотографий людей для удостоверений личности небольшого клуба, изображений размером около 64x64 пикселей достаточно.

person wiitus    schedule 09.05.2017