В этой статье мы создаём программу, которая генерирует, сохраняет, загружает и распознаёт QR-код на C# в проекте Windows Forms.
Для начала немного разберём, что такое QR-код. Это такой двумерный штрихкод, который кодирует в себя данные в виде различных символов. Распознаётся он специальными сканерами. Выглядит QR-код как квадратная картинка в чёрными и белыми квадратиками, хаотично расположенными по всему его периметру. Например так:
Скоро мы сможем распознать, что же за информация спрятана за этой абстрактной картинкой.
Перво-наперво нам надо скачать одну библиотеку .dll. Она прикреплена внизу нашей статьи вместе с исходником самой программы. Называется она MessagingToolkit.QRCode.dll, и благодаря ней можно легко распознать или сгенерировать QR-код на С#.
Теперь мы создаём проект, а затем дизайн формы. Выглядит он вот так:
Выводиться сгенерированный QR-код будет в PictureBox’е.
Теперь нам нужно подключить нашу dll-библиотеку. Для этого в обозревателе решений щёлкаем правой кнопкой мыши на References и нажимаем «Добавить ссылку»:
В открывшемся окне в меню слева нажимаем «Обзор»:
Затем внизу окна нажимаем «Обзор», выбираем нашу библиотеку, и нажимаем «Добавить»:
Библиотека добавлена, но её ещё нужно привязать к нашей программе. Для этого мы в части кода, где находятся все using’и пишем:
1 2 |
using MessagingToolkit.QRCode.Codec; using MessagingToolkit.QRCode.Codec.Data; |
Теперь наша библиотека подключена, можно приступать к самой программе.
Дважды кликаем на кнопку «Создать QR код» и пишем следующее:
1 2 3 4 5 6 7 |
private void button1_Click(object sender, EventArgs e) { string qrtext = textBox1.Text; //считываем текст из TextBox'a QRCodeEncoder encoder = new QRCodeEncoder(); //создаем объект класса QRCodeEncoder Bitmap qrcode = encoder.Encode(qrtext); // кодируем слово, полученное из TextBox'a (qrtext) в переменную qrcode. класса Bitmap(класс, который используется для работы с изображениями) pictureBox1.Image = qrcode as Image; // pictureBox выводит qrcode как изображение. } |
Проверим, всё ли у нас работает. Запускаем программу, пишем в ней любой текст (к сожалению, кириллица у нас в программе не поддерживается, поэтому пишем на латинице), а затем нажимаем на кнопку «Создать QR код»:
Всё работает! QR-код создаётся. Продолжаем.
Теперь мы добавим в нашу программу возможность сохранять изображение QR-кода, который мы получили.
Дважды щёлкаем на кнопку «Сохранить QR код». Пишем внутри следующее:
1 2 3 4 5 6 7 8 9 |
private void button2_Click(object sender, EventArgs e) { SaveFileDialog save = new SaveFileDialog(); // save будет запрашивать у пользователя, место, в которое он захочет сохранить файл. save.Filter = "PNG|*.png|JPEG|*.jpg|GIF|*.gif|BMP|*.bmp"; //создаём фильтр, который определяет, в каких форматах мы сможем сохранить нашу информацию. В данном случае выбираем форматы изображений. Записывается так: "название_формата_в обозревателе|*.расширение_формата") if (save.ShowDialog() == System.Windows.Forms.DialogResult.OK) //если пользователь нажимает в обозревателе кнопку "Сохранить". { pictureBox1.Image.Save(save.FileName); //изображение из pictureBox'a сохраняется под именем, которое введёт пользователь } } |
Опять проверяем. Пишем что-нибудь в TextBox’e, генерируем QR-код, затем нажимаем на кнопку «Сохранить QR код». Появляется окно «Сохранение». Выбираем место, куда хотим сохранить наше изображение, задаём ему имя, выбираем формат:
Затем нажимаем «Сохранить» и смотрим, действительно ли изображение сохранилось:
Да, всё работает! Продолжаем, на очереди загрузка изображения с QR-кодом.
Переходим к коду кнопки «Загрузить QR код». Там пишем следующее:
1 2 3 4 5 6 7 8 |
private void button3_Click(object sender, EventArgs e) { OpenFileDialog load = new OpenFileDialog(); // load будет запрашивать у пользователя место, из которого он хочет загрузить файл. if (load.ShowDialog() == System.Windows.Forms.DialogResult.OK) // //если пользователь нажимает в обозревателе кнопку "Открыть". { pictureBox1.ImageLocation = load.FileName; // в pictureBox'e открывается файл, который был по пути, запрошенном пользователем. } } |
Проверяем и эту функцию. Запускаем программу, нажимаем нашу кнопку, ищем QR-код, который мы сохраняли до этого (или любой другой, но чтобы его изображение было размером 181х181 пиксель):
Готово, картинка появилась у нас в программе:
Мы смогли загрузить изображение, но как же нам прочитать, что в нём закодировано? Сейчас мы напишем код, который поможет нам распознать QR-код с изображения.
Дважды щёлкаем мышью на кнопке «Распознать QR код» в форме и пишем в открывшемся окне:
1 2 3 4 5 |
private void button4_Click(object sender, EventArgs e) { QRCodeDecoder decoder = new QRCodeDecoder(); // создаём "раскодирование изображения" MessageBox.Show(decoder.decode(new QRCodeBitmapImage(pictureBox1.Image as Bitmap))); //в MessageBox'e программа запишет раскодированное сообщение с изображения, которое предоврительно будет переведено из pictureBox'a в класс Bitmap, чтобы мы смогли с этим изображением работать. } |
Настало время протестировать нашу последнюю функцию. Открываем какое-нибудь изображение QR-кода, например то, что находится в самом верху статьи. Изображение успешно загрузилось и появилось в нашем PictureBox’e. Затем нажимаем на кнопку «Распознать QR код». И вот, что у нас появляется:
Вот и всё! Наша программа, которая генерирует и распознаёт QR-код на C# готова! Ниже вы можете найти исходник с подробными комментариями и dll-библиотеку работы с QR-кодом.
Скачать MessagingToolkit.QRCode.dll Скачать исходник
Поделиться в соц. сетях:
Спасибо! Ваша статья очень помогла мне!
Здравствуйте! Очень интересная статься, да и сайт у вас довольно интересный, спасибо))) Но не могли бы помочь? Как мне например вызвать камеру для считывания этого QR-кода?
Здравствуйте, Олег! Спасибо за Ваш отзыв!
Насчет камеры: слышал про такую библиотеку WebCam_Capture.dll — попробуйте, может, подойдет.
Для вызова камеры можно использовать библиотеку OzekiComputerVision.dll из набора программ Ozeki camera SDK. Есть рабочий метод, если еще актуально, могу поделится.
А как сделать тоже самое но в asp.net? Особенно интересует распознование
Аналогично. Сделайте элемент image доступным для сервера c помощью атрибутов ID=»QRCode» runat=»server». По идентификатору QRCode получите изображение и распознайте его с помощью библиотеки MessagingToolkit.QRCode.dll
Спасибо за урок! Скажите пожалуйста, как подключить русский? И как убрать ошибку, когда нажимаешь сохранить несгенерированное изображение (через if?) ?
Чтобы корректно работал русский язык, нужно указать кодировку UTF-8:
при создании qr-кода:
Bitmap qrcode = encoder.Encode(qrtext, Encoding.UTF8);
при его расшифровке:
string s = decoder.decode(new QRCodeBitmapImage(pictureBox1.Image as Bitmap), Encoding.UTF8);
Чтобы не было ошибки при сохранении (когда qr-код еще не создан), заключите весь код этой кнопки в такое условие:
if (pictureBox1.Image != null)
{
}
Отлично, все работает! Спасибо большое!
Что за библиотека MessagingToolkit.QRCode.dll и какое в ней ограничение по длине строки?
Это сторонняя библиотека. Ссылка для ее скачивания есть в конце статьи.
Максимальное количество символов, которые помещаются в один QR-код в принципе (по стандарту):
цифры — 7089;
цифры и буквы (латиница) — 4296;
двоичный код — 2953 байт (следовательно, около 2953 букв кириллицы в кодировке windows-1251 или около 1450 букв кириллицы в utf-8);
иероглифы — 1817.
почему-то очень мало влазит символов(около 100), дальше выбивает ошибку.Как исправить? и как сделать что бы можно было менять размеры qr кодов? очень буду благодарен
Значит это ограничение данной библиотеки. Если нужно больше — попробуйте использовать в своем проекте какой-нибудь аналог.
а размер qr кода как поменять можно? А по поводу длины выше говорилось же, что около 1к символов должно влазить
А можно ли как-то сделать в этой же программе захват/распознование QR кода с веб камеры?
Привет! Спасибо за пример!! а как например поменять цвет QR и сделать переход цвета?
Привет! Цвет фона qr-кода можно поменять с помощью изменения значения поля QRCodeBackgroundColor объекта класса QRCodeEncoder.
Для примера программы из статьи изменение цвета фона qr-кода можно сделать следующим образом:
encoder.QRCodeBackgroundColor = Color.Red;
В данном случае фон станет красным.