Автор блога Hack A Day Брайан Бенчофф (Brian Benchoff) разобрался в алгоритме генерации QR-кодов (стандарт ISO 18004) и составил инструкцию, как можно внедрить в QR-код произвольное изображение. Например, логотип фирмы.
Для работы использовались генератор QR-кодов и Microsoft Paint для попиксельного редактирования.
Шестая версия QR-кодов представляет собой квадрат со стороной 41 пиксел.
![](https://habrastorage.org/r/w1560/storage1/37544dc6/753823ae/b7482d42/4325441a.png)
На картинке показан шаблон QR. На нём чёрные пикселы всегда обязаны быть чёрными, а белые обязаны быть белыми. Серая зона свободна для творчества.
Серое пространство разделяется на 172 восьмипиксельных участка, как показано ниже.
![](https://habrastorage.org/r/w1560/storage1/d589c6c2/ae9c2656/c765356d/a79f56cf.png)
Некоторые зоны разбиты на две части и разнесены в пространстве, они соединяются чёрными линиями. Как показывает опыт, около 30% зон могут быть заполнены случайной информацией, и телефон всё равно сможет раскодировать информацию. Таким образом, из наших 172 зон можно использовать примерно 51 штуку, придавая любую форму и цвет.
То есть можно нарисовать рисунок размером 51 пиксел. Например, вот логотип Hack A Day.
![](https://habrastorage.org/r/w1560/storage1/84f3f42f/44167436/ed7eb5be/cd2ca3fb.png)
Важно сделать контрастный контур, чтобы логотип отделялся от разнородного фона. Если поместить этот логотип на шаблок QR-кода, получится примерно такая картина.
![](https://habrastorage.org/r/w1560/storage1/cd215942/6bee215e/60ee48bc/a46a5f1b.png)
Теперь нужно подсчитать, какое количество восьмипиксельных зон затронуто логотипом. Похоже, что не больше 51 штуки, так что всё нормально, поэтому можно переходить к следующему этапу: генерации настоящего QR-кода поверх этой картинки. Открываем вышеупомянутый генератор QR-кодов, выбираем шестую версию, уровень коррекции ошибок и указываем информацию для закодирования (http://www.hackaday.com). Поверх полученного кода вставляем логотип.
![](https://habrastorage.org/r/w1560/storage1/c316ecc0/c3276263/d12f4080/c3753963.png)
Вот такую штуку уже можно печатать на визитках.
Чтобы делать по-настоящему красивые логотипы, можно взять QR-код большего размера. Например, 14-й версии со стороной квадрата 73 пиксела. При определённых условиях можно даже залезать в служебную зону на границе.
![](https://habrastorage.org/r/w1560/storage1/57764e8d/38b4ffad/cecc7217/93da8095.png)
IBM выглядит реально красиво в этом размере. Для сравнения, IBM в QR v6 не столь впечатляет.
Заметьте, что пикселы можно делать любого цвета: белого, чёрного, красного или лилового, важен только контраст между ними. Поскольку в данном логотипе буквы IBM относительно тёмные, то алгоритм воспримет их как чёрные. Использование цвета — удобный приём, который позволяет избавиться от контрастной границы и, таким образом, экономит пространство для логотипа.
![](https://habrastorage.org/r/w1560/storage1/01cde020/31673097/9d133cb8/86b4354a.png)
Если бы у логотипа Firefox была белая граница, то он бы покрыл больше 30% площади изображения. А с использованием цвета он покрывает меньше 30% и этот QR-код прекрасно считывается.
Кстати, вам совсем не обязательно ограничивать себя попиксельным разрешением QR-кода, вы можете вставить изображение и с более высоким разрешением. Правда, оно уже не будет смотреться столь органично.
![](https://habrastorage.org/r/w1560/storage1/f1e3ca92/d6517fe0/e02b924e/a5ca2355.png)
UPD. В Android Market появилось приложение MeCode Beta, которое позволяет генерировать произвольные штрих-коды на телефоне, в том числе и с логотипами. Очень удобная вещь — можно вывести картинку на экран и обмениваться информацией с другими телефонами.
Для работы использовались генератор QR-кодов и Microsoft Paint для попиксельного редактирования.
Шестая версия QR-кодов представляет собой квадрат со стороной 41 пиксел.
![](https://habrastorage.org/storage1/37544dc6/753823ae/b7482d42/4325441a.png)
На картинке показан шаблон QR. На нём чёрные пикселы всегда обязаны быть чёрными, а белые обязаны быть белыми. Серая зона свободна для творчества.
Серое пространство разделяется на 172 восьмипиксельных участка, как показано ниже.
![](https://habrastorage.org/storage1/d589c6c2/ae9c2656/c765356d/a79f56cf.png)
Некоторые зоны разбиты на две части и разнесены в пространстве, они соединяются чёрными линиями. Как показывает опыт, около 30% зон могут быть заполнены случайной информацией, и телефон всё равно сможет раскодировать информацию. Таким образом, из наших 172 зон можно использовать примерно 51 штуку, придавая любую форму и цвет.
То есть можно нарисовать рисунок размером 51 пиксел. Например, вот логотип Hack A Day.
![](https://habrastorage.org/storage1/84f3f42f/44167436/ed7eb5be/cd2ca3fb.png)
Важно сделать контрастный контур, чтобы логотип отделялся от разнородного фона. Если поместить этот логотип на шаблок QR-кода, получится примерно такая картина.
![](https://habrastorage.org/storage1/cd215942/6bee215e/60ee48bc/a46a5f1b.png)
Теперь нужно подсчитать, какое количество восьмипиксельных зон затронуто логотипом. Похоже, что не больше 51 штуки, так что всё нормально, поэтому можно переходить к следующему этапу: генерации настоящего QR-кода поверх этой картинки. Открываем вышеупомянутый генератор QR-кодов, выбираем шестую версию, уровень коррекции ошибок и указываем информацию для закодирования (http://www.hackaday.com). Поверх полученного кода вставляем логотип.
![](https://habrastorage.org/storage1/c316ecc0/c3276263/d12f4080/c3753963.png)
Вот такую штуку уже можно печатать на визитках.
Чтобы делать по-настоящему красивые логотипы, можно взять QR-код большего размера. Например, 14-й версии со стороной квадрата 73 пиксела. При определённых условиях можно даже залезать в служебную зону на границе.
![](https://habrastorage.org/storage1/57764e8d/38b4ffad/cecc7217/93da8095.png)
IBM выглядит реально красиво в этом размере. Для сравнения, IBM в QR v6 не столь впечатляет.
Заметьте, что пикселы можно делать любого цвета: белого, чёрного, красного или лилового, важен только контраст между ними. Поскольку в данном логотипе буквы IBM относительно тёмные, то алгоритм воспримет их как чёрные. Использование цвета — удобный приём, который позволяет избавиться от контрастной границы и, таким образом, экономит пространство для логотипа.
![](https://habrastorage.org/storage1/01cde020/31673097/9d133cb8/86b4354a.png)
Если бы у логотипа Firefox была белая граница, то он бы покрыл больше 30% площади изображения. А с использованием цвета он покрывает меньше 30% и этот QR-код прекрасно считывается.
Кстати, вам совсем не обязательно ограничивать себя попиксельным разрешением QR-кода, вы можете вставить изображение и с более высоким разрешением. Правда, оно уже не будет смотреться столь органично.
![](https://habrastorage.org/storage1/f1e3ca92/d6517fe0/e02b924e/a5ca2355.png)
UPD. В Android Market появилось приложение MeCode Beta, которое позволяет генерировать произвольные штрих-коды на телефоне, в том числе и с логотипами. Очень удобная вещь — можно вывести картинку на экран и обмениваться информацией с другими телефонами.