gifts2017

Создание QR кода с логотипом компании

Опубликовал Петр Базелюк (pbazeliuk) в раздел Программирование - Практика программирования

Генерация QR кода с помощью api google с последующим нанесением логотипа компании

QR код может иметь около 30% зон заполненной случайной информацией - эти 30% нам и нужны. Согласно википедии«Исправляется до 30% повреждений (фиксированные уровни в 7, 15, 25 и 30 процентов)» и телефон всё равно сможет раскодировать информацию. Таким образом QR коду возможно придавать любую форму и цвет. 

Стартовой точкой послужил этот ресурс http://bit.ly/pwcDQL.

Для формирования текста использовалась код из публикации: http://infostart.ru/public/80106/, с исправлением некоторых недочетов.


Порядок действий:

  1. Генерируем текст, который надо прописать в QR-коде;
  2. Используем ссылку «http://chart.apis.google.com/chart?cht=qr&chs=308×308&chl=» +»Наш текст»;
  3. Скачиваем картинку (стандартным 1С способом без использования внешней компоненты);
  4. С помощью программы IrfanView редактируем картинку и наносим watermark (в автоматическом режиме);
  5. Размещаем картинку (в данной статье РисунокТабличногоДокумента).


Код реализации:

filename = СоздатьQR_Code_Чек("тут данные");
Если НЕ filename = Неопределено Тогда
      ОбластьQR_Code.Рисунки.D1.Картинка =Новый Картинка(filename);
      ТабличныйДокумент.Вывести(ОбластьQR_Code);
      УдалитьФайлы(filename);
КонецЕсли;

 
Функция СоздатьQR_Code_Чек(Соответствие) Export
        Строка = "QR код с логотипом" + Символы.ПС;
        Data = EncodeURL(Строка);
        filename = СоздатьQR_Code(Data);

        Если НЕ filename = Неопределено Тогда
                Ком = Новый COMObject("wScript.Shell");
                Ком.Run("cmd /c start /wait c:\IrfanView\i_view32.exe " + filename + " /crop=(17,17,270,270) /advancedbatch /aspectratio /resample /silent /convert=" + filename, , Истина);
        КонецЕсли;

        Возврат filename;

КонецФункции



Функция СоздатьQR_Code(Data) Export
         Возврат ПолучитьКартинкуПоHTTPСсылке("chart.apis.google.com", "chart?cht=qr&chs=308x308&chl=" + Data);
КонецФункции



Функция ПолучитьКартинкуПоHTTPСсылке(Server, Ref) Export

        ИмяВременногоФайла = ПолучитьИмяВременногоФайла("png");

        Попытка
               Соединение = Новый HTTPСоединение(Server);
               Соединение.Получить(Ref, ИмяВременногоФайла);
               Возврат ИмяВременногоФайла;
        Исключение
               Возврат Неопределено;
        КонецПопытки;

КонецФункции
 
 

Функция КонвертироватьСтрокуHEX(Значение) Export

        Значение = Число(Значение);
        Если Значение <= 0 Тогда
               Результат = "0";
        Иначе
               Значение = Цел(Значение);
               Результат = "";
               Пока Значение > 0 Цикл
                       Результат = Сред("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ", Значение%16 + 1,1) + Результат;
                       Значение = Цел(Значение / 16) ;
                КонецЦикла;
        КонецЕсли;

        Если СтрДлина(Результат) < 2 Тогда
                Результат = "0" + Результат;
        КонецЕсли;
        Возврат "%" + Результат;
КонецФункции



Функция EncodeURL(URL) Export
        Рез = "";
        Для Сч = 1 По СтрДлина(URL) Цикл
               ch = Сред(URL,Сч,1);
               vch = КодСимвола(ch);
              Если ("A" <= ch ) И ( ch <= "Z") Тогда // "A".."Z"
                        Рез = Рез + ch;
             ИначеЕсли ("a" <= ch ) И ( ch <= "z") Тогда // "a".."z"
                        Рез = Рез + ch;
             ИначеЕсли ("0" <= ch ) И ( ch <= "9") Тогда // "0".."9"
                        Рез = Рез + ch;
             ИначеЕсли (ch = " ") ИЛИ ( ch = "+") Тогда // space
                        Рез = Рез + "+";
             ИначеЕсли (ch = "-" ) ИЛИ ( ch = "_") // unreserved
                ИЛИ (ch = ".") ИЛИ (ch = "!")
                ИЛИ (ch = "~") ИЛИ (ch = "*")
                ИЛИ (ch = "") ИЛИ (ch = "(")
                ИЛИ (ch = ")") Тогда
                        Рез = Рез + ch;
             ИначеЕсли (vch <= 127) Тогда // other ASCII
                        Рез = Рез + КонвертироватьСтрокуHEX(vch);
             ИначеЕсли (vch <= 2047) Тогда // non-ASCII
                        Рез = Рез + КонвертироватьСтрокуHEX(192 + Цел(vch / 64));
                        Рез = Рез + КонвертироватьСтрокуHEX(128 + (vch % 64));
             Иначе // 0x7FF < ch
                        Рез = Рез + КонвертироватьСтрокуHEX(224 + Цел(vch / 4096));
                        Рез = Рез + КонвертироватьСтрокуHEX(128 + (Цел(vch / 64) % 64));
                        Рез = Рез + КонвертироватьСтрокуHEX(128 + (vch % 64));
             КонецЕсли;
      КонецЦикла;
       Возврат Рез;
КонецФункции
 

 

Разберем строчку кода:

 Ком.Run("cmd /c start /wait c:\IrfanView\i_view32.exe " + filename + " /crop=(17,17,270,270) /advancedbatch /aspectratio /resample /silent /convert=" + filename, , Истина);

"cmd" - запуск команднои строки.

"/c" - дождаться завершения работы команд и завершить сеанс cmd

"start /wait" - дает нам возможность запустить приложение и ждать его завершения

"/crop=(17,17,270,270)" - обрезать часть изображение по заданым параметрам (x, y, widht, height) 

"/advancedbatch" - использовать продвинутые опции

"/aspectratio" - сохранять пропорции изображения

"/resample" - минимизировать потери качества

"/silent" - не выводить сообщения про ошибки и предупреждения

"/convert=" - конвентировать и записать в файл с именем


И сам watermark, нужно запустить IrfanView и произвести настройки:

После настройки сохраните: "Save settings"


Для работы выбирайте логотип который будет занимать не более 30% QR-кода, так же для повышения читаемости исспользуйте прозрачность, в этом примере логотип занимает не более 15%. Удачных Вам свершений.


UPD: Irfanview сохраняет настройки для каждого пользователя отдельно. (вот здесь: C:\Users\ИмяПользователя\AppData\Roaming\IrfanView). Если вы используете файловый вариант базы, для каждого пользователя нужно скопировать настройки IrfanView в эту папку. Если же это серверный вариант - достаточно скопировать настройку пользователю от которого запущена служба 1С.

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Анатолий (Yasen) 14.05.12 11:38
Отлично! Год назад читал про возможность стилизации QR-кодов, но посчитал большой роскошью платить специальным дизайнерам за такую работу.
Спасибо!
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа