Dwuwymiarowe kody QR – generator

Wszyscy znamy kody kreskowe, są bardzo popularne. Praktycznie każdy produkt jest nimi opatrzony. Problem jaki mają tradycyjne kody kreskowe to praktycznie brak mechanizmu korekcji błędów, który powoduje, że zniszczenie części kodu powoduje jego całkowitą nieczytelność. Dzięki temu możemy dłużej postać w kasach sklepowych. W tych samych kasach można zauważyć, że czasem ciężko odczytać kod, gdy jest pomięty. To wszystko powoduje, że już jakiś czas temu powstała alternatywa w postaci kodów 2D – kodów QR – czy kodów kropkowych (jak czasem się je nazywa). Sam pisałem już o kodach 2d ponad 2 lata temu tutaj. Temat ten (patrząc na statystyki oglądalności) ciągle jest popularny i wiele osób poszukuje informacji na temat samych kodów jak i sposobu generowania ich.

Wyższość kodów 2D polega na tym, że są skonstruowane w sposób pozwalający odczytać je prawidłowo pomimo częściowego uszkodzenia. Co więcej, ilość znaków, które możemy zapisać za ich pomocą jest teoretycznie nieograniczona (w niektórych formatach oczywiście). Same kody pozwalają zapisywać zarówno cyfry jak i znaki alfanumeryczne (oraz kilka innych) dzięki czemu za ich pomocą możemy zapisywać adresy stron WWW co oczywiście jest często wykorzystywane. Praktycznie każdy telefon ma obecnie aparat (nazwijmy to) fotograficzny. To znowu pozwala aby robić zdjęcia kodów i odczytywać je w telefonie. To jest idealny sposób, aby przepisać adres strony czy coś innego do komórki. Dzisiejszy wpis poświęcony będzie zatem małemu narzędziu, które pozwoli na wygenerowanie kodu QR, oczywiście w postaci dodatku do DesktopInfo.

Na pomoc w generowaniu kodów QR przychodzi biblioteka messagingtoolkit, która jest odpowiedzialna za stworzenie odpowiedniej bitmapy. Biblioteka upraszcza proces generowania kodów QR jest uproszczona do bólu.

[csharp]

var qrGenerator = new QRCodeEncoder{
QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE,
QRCodeScale = 4,
QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.M,
QRCodeVersion=4
};

var image = qrGenerator.Encode((String)textBox.Text);

[/csharp]

Ot cała filozofia. Potrzebujemy ustawić 4 zmienne. QRCodeEncodeMode pozwala określić czy chcemy kodować tekst, cyfry czy wszystko inne. Nas interesuje byte – czyli wszystko inne – co pozwala na kodowanie wszystkiego tego co chcemy (adresów internetowych przede wszystkim) z zachowaniem wielkości znaków. QRCodeScale pozwala określić rozmiar, QRCodeErrorCorrection określa tryb korekcji błędów co jednoznacznie przekłada się na nadmiarowość powodującą zwiększenie rozmiaru kodu przy jednoczesnym zwiększeniu jego odporności na błędy odczytu oraz uszkodzenia samego kodu. Ostatnia zmienna QRCodeVersion pozwala określić ilość znaków jakie możemy zakodować. Praktycznie wartość ta może wynosić od 1 do 40. Co daje zmiana tej wartości można sprawdzić na tej tabeli.

Generalnie zwiększając QRCodeVersion zwiększamy ilość znaków, które możemy zakodować, zwiększając QRCodeErrorCorrect zmniejszamy ilość znaków jakie możemy zakodować ale zwiększamy odporność (CodeErrorCorrect może przyjmować wartości L,M,Q,H – od najsłabszej do najsilniejszej korekcji błędu).

Wracając do samej biblioteki, w zmiennej image otrzymujemy Bitmap zwierający nasz obraz. Ponieważ aplikacja działa w WPF to aby wyświetlić ją w Image należy przekonwertować Bitmap do ImageSource (tutaj dziękuję za pomoc Piotrowi)

 [csharp]ImageSource TransformBitmap(Bitmap bmp){
 var bi = new BitmapImage();
 bi.BeginInit();
 bi.StreamSource = ConvertImageToMemoryStream(bmp);
 bi.EndInit();
 return bi;
}

private static Stream ConvertImageToMemoryStream(Bitmap bmp){
 var result = new MemoryStream();
 bmp.Save(result, ImageFormat.Bmp);
 return result;
} 
[/csharp]



Scroll to top