Круглый qr код. Генерируем цветной QR-код с логотипом на Java

Некоторое время назад мне потребовалось генерировать несколько QR-кодов для каждого пользователя системы. А чтобы было интересно сканировать этот код, было решено добавить в него логотип.

Предисловие
QR-коды можно встретить везде, но как их отличить друг от друга? QR-коды всё время завоёвывают популярность, и нет-нет, да и встретятся несколько штук рядом. Зрелище это не из приятных - какой сканировать первым? И вообще, зачем сканировать то, от чего начинает рябить в глазах?
Решением такой задачи может служить персонализирование QR-кода: нестандартные цвета, логотип, или пояснительная надпись немного ниже самого кода, по которой можно понять - интересно ли зрителю это или нет.
Навеняка многие видели красивые QR-коды (а кто не видел, может посмотреть на хабре или на стороннем ресурсе), но мне стоит оговориться - чтобы создать такой, нужно вложить либо большие ресурсы в алгоритм генерации картинки, либо нарисовать такой код в фотошопе, но это будет единичный экземпляр, и для большинства из нас он не годится (если, конечно, есть вообще необходимость генерировать их самому).
Как это реализовано?
Создатели QR-кодов не расчитывали, что мы будем вставлять свои картинки в закодированные сообщения, коими являются сами коды, но они предусмотрели возможность высокого объёма восстановительной информации - код может содержать до 30% последней. Чем её больше - тем гуще картинка, но больше шансов, что пользователь раскодирует испорченный код. А портить мы его будем логотипом.
Для генерации кода использовалась библиотека ZXing - это open source библиотека для обработки различных 1D/2D штрихкодов, которая, кроме Java, имеет порты на другие языки.
Особенностью этой библиотеки является то, что она разбита на модули и распространяется в исходных кодах, которые необходимо компилировать. Но, к счастью, она есть в мавен репозитории - модуль core использовался для генерации, и модуль java se использовался для валидации кодов.
Для работы с графикой были использованы стандартные классы из пакета java.awt (JavaSE).
За дело!
Для экспериментов была сделана небольшаю консольная программа, которую можно найти на гитхабе - репозиторий опытного образца , которую я и разберу в этом разделе.

Тот, кому просто нужен QR-код, может написать следующее:
BitMatrix matrix = new MultiFormatWriter().encode("text to encode", BarcodeFormat.QR_CODE, width, height); MatrixToImageWriter.writeToFile(matrix, filename.substring(filename.lastIndexOf(".")+1), new File(filename));
В противном случае так делать не стоит - по умолчанию библиотека добавит мало восстановительной информации, и даже если после вставки логотипа картинка расшифруется у нас на компьютере, то с фотокамеры она уже может считаться неправильно. По-этому будет хорошим тоном добавить максимум восстановительной информации, а раз мы будем изменять цвета и картинку, то не нужно спешить сохранять результат:
Hashtable hintMap = new Hashtable(); hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); QRCodeWriter qrCodeWriter = new QRCodeWriter(); BitMatrix bitMatrix = qrCodeWriter.encode(content, BarcodeFormat.QR_CODE, qrCodeSize, qrCodeSize, hintMap);
Создание картинки из матрицы кода делается в цикле - создаём картинку соответствующего размера и, проходя матрицу кода, отображаем наличие бита в матрице на картинку как информативный пиксель. Во время этого действа можно задать цвет фона и цвет кода:
int matrixWidth = bitMatrix.getWidth(); BufferedImage image = new BufferedImage(matrixWidth, matrixWidth, BufferedImage.TYPE_INT_RGB); image.createGraphics(); Graphics2D graphics = (Graphics2D) image.getGraphics(); graphics.setColor(Color.white); graphics.fillRect(0, 0, matrixWidth, matrixWidth); Color mainColor = new Color(51, 102, 153); graphics.setColor(mainColor); //Write Bit Matrix as image for (int i = 0; i < matrixWidth; i++) { for (int j = 0; j < matrixWidth; j++) { if (bitMatrix.get(i, j)) { graphics.fillRect(i, j, 1, 1); } } }
Ну вот, теперь, когда мы оперируем картинкой, а не матрицей единиц и нулей, нам очень даже удобно и логотип в центр поместить, предварительно поправив его разрешение, чтобы не перекрывать весь код в случае слишком большого размера:
BufferedImage logo = ImageIO.read(this.getLogoFile()); double scale = calcScaleRate(image, logo); logo = getScaledImage(logo, (int)(logo.getWidth() * scale), (int)(logo.getHeight() * scale)); graphics.drawImage(logo, image.getWidth()/2 - logo.getWidth()/2, image.getHeight()/2 - logo.getHeight()/2, image.getWidth()/2 + logo.getWidth()/2, image.getHeight()/2 + logo.getHeight()/2, 0, 0, logo.getWidth(), logo.getHeight(), null); private BufferedImage getScaledImage(BufferedImage image, int width, int height) throws IOException { int imageWidth = image.getWidth(); int imageHeight = image.getHeight(); double scaleX = (double)width/imageWidth; double scaleY = (double)height/imageHeight; AffineTransform scaleTransform = AffineTransform.getScaleInstance(scaleX, scaleY); AffineTransformOp bilinearScaleOp = new AffineTransformOp(scaleTransform, AffineTransformOp.TYPE_BILINEAR); return bilinearScaleOp.filter(image, new BufferedImage(width, height, image.getType())); }
После нашего надругательства над кодом, обязательно стоит его проверить на правильность - хватит ли восстановительной информации для идеальной фотокамеры? И если хватит, то пора сохранить катинку и отдать её пользователю:
if (isQRCodeCorrect(content, image)) { ImageIO.write(image, imageFormat, this.getGeneratedFileStream()); } private boolean isQRCodeCorrect(String content, BufferedImage image){ boolean result = false; Result qrResult = decode(image); if (qrResult != null && content != null && content.equals(qrResult.getText())){ result = true; } return result; } private Result decode(BufferedImage image){ if (image == null) { return null; } try { LuminanceSource source = new BufferedImageLuminanceSource(image); BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source)); Result result = new MultiFormatReader().decode(bitmap, Collections.EMPTY_MAP); return result; } catch (NotFoundException nfe) { return null; } }

Поставленная цель достигнута - QR код сгенерирован. Спасибо за внимание!

Инструмент создаёт QR-код онлайн с заданным текстом. Выберите соответствующий тип QR-кода, чтобы указать в нём адрес сайта, телефон, емайл, контактную информацию и другие параметры. Чтобы указать произвольную текстовую информацию выберите тип QR-кода "текст". Задайте необходимый цвет и фон, а также выберите лучший вид для вашего QR-кода.

Создать QR-код онлайн

Внимание! JavaScript отключен.
Без включенной поддержки JavaScript функция Генератор QR-кода работать не будет .
Включите в своём браузере поддержку JavaScript и обновите страницу.

Помощь. Ниже представлено краткое описание по созданию QR-кода. Основные типы QR-кодов и их префиксы.

QR Code (QR-код)

QR-код, в основном, предназначен для мобильных устройств и значительно упрощает ввод различной информации в телефон или планшет. Достаточно просканировать QR-код камерой мобильного устройства и вся распознанная информация окажется на вашем дисплее, затем её можно использовать как угодно, сохранять и редактировать. Для распознавания QR-кода необходимо воспользоваться специальной программой, которую можно установить бесплатно из Google Play (для Android), Apple Store (для iPhone и iPad) и Microsoft Store (для Windows Phone), для этого просто введите в строке поиска приложений "qr code" или "qr код" и вам будет предложено огромное количество вариантов. Наиболее интересные возможности есть у приложения QR Code от компании разработчика ZXing.

Цвет и фон QR-кода

Цвет и фон QR-кода можно задать любым, но слишком светлый QR-код не получиться распознать, по этому рекомендуется задать контрастное сочетания цветов — темный QR-код и светлый фон.

Уровень сглаживания QR-кода

Данный параметр превратит пиксельный QR-код в плавный, красивый и необычный рисунок.

Что содержит QR-код

QR-код может содержать URL, номер телефона, e-mail, контактную информацию, изображения, GPS координаты, любую текстовую информацию и даже параметры для автоматической настройки Wi-Fi сети.

URL - Web-сайт

Адрес Web-сайта или страницы. Можно указывать как с http:// так и без. Правильные примеры: , . Данный тип QR-кода позволит перейти на указанную страницу Web-сайта.

Текст

Обычная текстовая информация. Максимальная длина 1450 символов русского алфавита. Максимальное количество символов зависит от содержимого и может составлять:

  • 7089 только цифр;
  • 4296 цифры и буквы латинского алфавита;
  • 1817 иероглифов;
  • 2953 байт двоичного кода;
  • 2953 букв русского алфавита в кодировке windows-1251;
  • 1450 букв русского алфавита в кодировке UTF-8.

Телефон

Номер телефона. Формат номера телефона: +7900123456. Данный тип QR-кода позволит позвонить на указанный номер телефона.

SMS

Номер телефона для SMS и текстовое сообщение. Формат номера телефона: +7900123456. Данный тип QR-кода позволит создать SMS или MMS с уже заполненным номером и сообщением.

E-mail

E-mail адрес. Данный тип QR-кода позволит создать E-mail c уже заполненным адресом электронной почты (поле TO:). Также можно указать тему сообщения и сам текст сообщения.

Контакты

Контакты для адресной книги. Данный тип QR-кода добавит новую запись в адресную книгу, содержащую имя, номер телефона, E-mail, адрес, url и заметку. Если необходимо указать более одного номера телефона, перечислите их через запятую.

Wi-Fi сеть

Параметры подключения к Wi-Fi сети. Данный тип QR-кода позволит автоматически подключиться к Wi-Fi сети. Очень удобно для подключения к бесплатным Wi-Fi сетям в кафе, барах, ресторанах и другим сетям в общественных местах.

GPS координаты

Координаты для карты Google. Данный тип QR-кода позволит отобразить место на карте, соответствующее указанным координатам.

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

Префиксы QR-кода

Если указать номер телефона как +79001234567, то сканер QR-кодов распознает номер как обычный текст (цифры), а если указать специальный префикс tel:+79001234567, то сканер определит номер телефона и предложит позвонить по нему.

Префикс URL:

URL: — префикс QR-кода для указания Web-сайтов и страниц позволит перейти по указанной ссылке. Префикс URL: указывается заглавными буквами. Указание http:// необязательно.

  • Формат: URL:[адрес_сайта]
  • Примеры: URL:www..сайт

Префикс tel:

tel: — префикс QR-кода для указания номера телефона позволит позвонить по указанному номеру.

  • Формат: tel:[номер_телефона]
  • Пример: tel:+79001234567

Префикс smsto:

smsto: — префикс QR-кода для отправки SMS или MMS позволит отправить SMS по указанному номеру с указанным текстом.

  • Формат: smsto:[номер_телефона]:[сообщение]
  • Пример: smsto:+79001234567:Текст сообщения:

Префикс mailto:

mailto: — префикс QR-кода для указания E-mail адреса позволит отправить E-mail по указанному адресу.

Префикс MATMSG:

MATMSG: — префикс QR-кода для указания E-mail адреса позволит отправить E-mail по указанному адресу c указанной темой и текстом сообщения. Префикс MATMSG: указывается заглавными буквами, а в конце необходимы две точки с запятой.

  • Формат: MATMSG:TO:;SUB:[тема];Body:[сообщение];;
  • Пример: MATMSG:TO:[email protected];SUB:Тема сообщения;Body:Текст сообщения;;

Префикс geo:

geo: — префикс QR-кода для указания GPS координат позволит открыть карту Google в указанных координатах.

  • Формат: geo:[ширина,долгота]
  • Пример: geo:55.755768,37.617671

Префикс WIFI:

WIFI: — префикс QR-кода для автоматического подключения к Wi-Fi сети. Префикс WIFI:

  • Формат: WIFI:T:[тип_шифрования];S:[имя_wifi_сети];P:[пароль];H:[скрытая_сеть];; .
  • Примеры: WIFI:T:WEP;S:HomeNet;P:*****;; , WIFI:T:WEP;S:HomeNet;P:*****;H:true;;

Контакты MECARD:

MECARD: — префикс QR-кода meCard для записи контактов в адресную книгу телефона. Префикс MECARD: указывается заглавными буквами, в конце необходимы две точки с запятой.

  • Формат: MECARD:N:[имя,фамилия];SOUND:[транскрипция_имени];TEL:[телефон];TEL-AV:[номер_для_видеофона];EMAIL:;NOTE:[заметка];BDAY:[день_рождения];ADR:[адрес];URL:;NICKNAME:[прозвище];; .
  • Пример: MECARD:N:Иван,Петров;TEL:+79001234567;EMAIL:[email protected];NOTE:Текст с заметкой;BDAY:20010205;ADR:Красная площадь, д.

Существуют определенные причины, почему мобильные пользователи не хотят сканировать матричные коды. Например, клиенты их не замечают из-за того, что они размещены в невидных местах, или же пользователи не понимают, что от них хочет бренд в случае, если нет понятного призыва к действию рядом с изображением.

Но одна из самых частых причин, почему QR получают маленькое количество сканов, — это недостаточный контраст между цветами переднего и заднего плана.

Почему контраст так важен при генерировании QR кодов?

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

В случае если контраст между передним и задним планом небольшой, тогда сканирующее устройство не будет способно «увидеть» двухмерный код и, как следствие, не сможет его расшифровать.

Какой должен быть контраст?

Тональный контраст и оттеночный контраст

Чаще всего стандартные QR коды создаются черно-белыми (тональный контраст) и именно под сканирование таких qr разрабатываются мобильные приложения. Данные ридеры не способны различать оттенки цветов, они «видят» исключительно разницу двух противоположных цветов. В таком случае не прогадаешь, потому что черный и белый – контрастные цвета.

Если же вы генерируете цветной QR код (оттеночный контраст), то крайне важно учесть, чтобы разница в цветах была достаточно большой (например, красный и зеленый, красный и черный, красный и синий, желтый и синий), для того чтобы ридер смог «увидеть» два оттенка. Те цвета, которые видит глаз человека, диаметрально отличаются от восприятия цветов мобильным устройством. Поэтому обратите внимание на яркость одного из выбранных вами оттенков. Если два цвета будут похожи (оранжевый и желтый), в них не будет достаточно контраста, тогда ридер не сможет определить зашифрованную информацию.

Когда тонального контраста будет достаточно?

Количество тонального контраста для того, чтобы обеспечить быстрое и надежное сканирование, зависит от нескольких факторов:

  • Окружающий свет (даже черно-белые изображения могут быть не отсканированы при темном освещении).
  • Поверхность отражения (блестящая поверхность будет отражать белый цвет, не стоит выбирать белый фон, если вы хотите для переднего плана выбрать блестящие оттенки).
  • Расстояние сканирования (чем дальше расположен QR, чем меньше он виден камере, тем более выраженное контрастное различие должно быть между передним и задним планом).
  • Качество камеры (некоторые камеры имеют особые тональные диапазоны).

Поэтому лучше всего выбирать стандартный уровень контрастности, который будет работать в условиях сканирования любыми ридерами. Безопасный уровень контрастности должен быть не меньше 40%. При такой процентной разнице QR ридер сможет точно различить два цвета.

Традиционные черно-белые коды имеют наибольшую вероятность распознавания при условиях, если тональный контраст 100% (белый – 0%, черный – 100%).

Как быть с перевернутыми кодами?

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

Контраст для генерирования цветных кодов

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

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

*Обязательно учитывайте параметр контраста при создании дизайнерских и брендированных QR кодов.

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

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

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

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

Особое внимание при создании QR-кода необходимо обратить на цветную шкалу внизу. Она позволяет оценить читаемость кода после сделанных вами трансформаций. Не увлекайтесь особо и смотрите, чтобы шкала читаемости не зашкаливала, если хотите, чтобы ваш код легко могли прочитать любые устройства.