Merhaba, C# Karekod Oluşturma ve Okuma yazım ile yeni bir proje ile karşınızdayım. Biraz araştırma yapınca KareKod üretme konusunun sık aranan bir konu olduğunu gördüm ve hemen bir proje hazırlamak istedim.
C# Karekod Oluşturma ve Okuma
Bildiğiniz üzere karekod (QRCode) kullanımı yaygınlaşmaya başladı. Bir barkod ‘a göre daha fazla veri tutabildiği için özellikle kartvizitlerde sık kullanılır oldu. Basitçe bir karekod üzerinde ad soyad, email ve telefon bilgilerini yazabiliyorsunuz. Karekod okuyan uygulamalarla da kişi bilgilerinizi elle yazmak zorunda kalmıyor.
Mobil cihazların giderek yaygınlaştığını da düşünürsek, karekod kendine daha fazla kullanım alanı buluyor. Örnek vermek gerekirse, e-devletten aldığınız evrakların köşesinde bir karekod görebiliyorsunuz. Bu karekod ile kurumlar, ilgili evrağın gerçek mi yoksa sahte mi olduğunu anlayabiliyor. Yani bir e-imza görevi görebiliyor.
Bunlar dışında elbette farklı kullanım alanları da var. Gelin biz C# kullanarak karekod oluşturma ve okuma uygulamalarını nasıl yapacağımızı görelim.
Aşağıdaki videoda projenin nasıl çalıştığını gösteren videoyu izleyebilirsiniz.
Form tasarımım aşağıdaki gibidir.
Bu işlemi yapabilmek için öncelikle aşağıdaki bağlantıdan gerekli DLL dosyasını indiriyoruz. DLL zaten github’a yüklediğim proje dosyaları arasında yer alıyor. İndirme linkini de oradan veriyorum.
Form tasarımımız ve DLL hazırsa NameSpace’leri ekleyebiliriz.
using System.IO; using System.Drawing.Imaging; using MessagingToolkit.QRCode; using MessagingToolkit.QRCode.Codec; using MessagingToolkit.QRCode.Codec.Data;
C# Karekod Oluşturma
İlk olarak KareKod Üret button nesnesinin Click eventine gelelim ve kodlarımızı yazalım.
private void btn_karekod_uret_Click(object sender, EventArgs e) { try { if (rad_ALPHA_NUMERIC.Checked == true || rad_BYTE.Checked == true || rad_NUMERIC.Checked == true) pc_karekod.Image = KareKodOlustur(txt_karekod_icerik.Text, 4); else MessageBox.Show("Lütfen ENCODE_MODE seçiniz.", "Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Warning); } catch (Exception) { MessageBox.Show("Karakter sınırını aştınız. Lütfen biraz kısaltın", "Hata!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Burada, bir ENCODE_MODE seçmeden karekod üretme işlemi yapılmasını engelliyoruz.
ENCODE_MODE türleri;
- ALPHA_NUMERIC: Burada yaptığım denemelerde, text içerik yazarak karekod üretme işlemi yaparsak, tekrar okumak istediğimizde sadece 00000 olarak geliyor. Sayılarda bir sorun yok.
- NUMERIC: Üretmek istediğiniz karekod içerisinde sadece sayılar olacaksa bunu seçmeniz daha iyidir. Hem boyut açısından daha küçük oluyor hemde daha fazla karakter yazabiliyorsunuz.
- BYTE: Her türlü karakteri destekliyor. Türkçe karakter yazarsanız uygulamamızda okunuyor ancak, telefonumdaki karekod okuma uygulamasında okuttuğumda Türkçe karakterler soru işareti olarak geliyor.
Burada çıkan Exception karekod boyutu ile ilgilidir. Çok fazla deneme yaptım ama net bir sonuç çıkaramadım. Genellikle oluşturulan KareKod’ların boyutları 10.5 KB yi geçmiyor ve ortalama 187 karakter alıyor. Encode Mode, numeric seçilirse karekod boyutu 8 KB kadar oluyor ve yine ortalama 187 karakter alıyor.
KareKodOlustur() metodunun kodları aşağıdadır.
private Image KareKodOlustur(string giris, int kkDuzey) { var deger = giris; MessagingToolkit.QRCode.Codec.QRCodeEncoder qre = new MessagingToolkit.QRCode.Codec.QRCodeEncoder(); if (rad_ALPHA_NUMERIC.Checked == true) qre.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.ALPHA_NUMERIC; if (rad_BYTE.Checked == true) qre.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE; if (rad_NUMERIC.Checked == true) qre.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.NUMERIC; qre.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L; qre.QRCodeVersion = kkDuzey; System.Drawing.Bitmap bm = qre.Encode(deger); return bm; }
Buradaki kodlar, projemize eklediğimiz DLL’den geldiğinden dolayı açıklayabileceğim kadar bilgi sahibi değilim.
TextBox’a yazdığımız karakteri sayma işlemi de aşağıdaki gibidir.
private void txt_karekod_icerik_TextChanged(object sender, EventArgs e) { label1.Text = "Karakter Sayısı : " + txt_karekod_icerik.Text.Length.ToString(); }
C# Karekod Okuma
KareKod Çöz button nesnesinin Click eventine gelelim ve kodlarımızı yazalım.
private void btn_karekod_coz_Click(object sender, EventArgs e) { karekod_cozumle(); } void karekod_cozumle() { try { QRCodeDecoder decoder = new QRCodeDecoder(); txt_karekod_icerik.Text = decoder.decode(new QRCodeBitmapImage(pc_karekod.Image as Bitmap)); } catch (MessagingToolkit.QRCode.ExceptionHandler.DecodingFailedException ex) { MessageBox.Show("Karekod çözümlenemiyor.", "Hata!", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
karekod_cozumle() metodumuzu iki yerde kullanacağımız için metoda aldık.
ContextMenuStrip – Karekod Getir ve Oku
OpenFileDialog nesnesini kullanarak, bilgisayarımızdan okunmasını istediğimiz karekod görselini seçiyoruz. karekod_cozumle() metodumuzla da seçilen karekod’u okuyoruz.
private void karekodGetirVeOkuToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog file = new OpenFileDialog() { Title = "Karekod Seçin", Filter = "JPG Dosyası |*.jpg| PNG Dosyası|*.png| GIF Dosyası|*.gif| Bitmap Dosyası|*.bmp", FilterIndex = 1, RestoreDirectory = true, InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop), }; string DosyaYolu; if (file.ShowDialog() == DialogResult.OK) { DosyaYolu = file.FileName; pc_karekod.Image = Image.FromFile(DosyaYolu); karekod_cozumle(); } }
ContextMenuStrip – Karekod Kaydet
Kaydedilen dosya adı olarak, Multine TextBox nesnesinin ilk satırında bir şey yazmıyor ise o anın tarih ve zamanının alınmasını söyledik.
SaveFileDialog penceresi açıldığında, karekod görselinin bir ismi yazılı olsun diye de SaveFileDialog tanımlamasında FileName özelliğini dolu olarak gönderdik.
Eğer karekod üretme işlemi yapılmamışsa, yani PictureBox nesnesinde görsel yoksa kaydetme işlemine girmedik.
private void karekodKaydetToolStripMenuItem_Click(object sender, EventArgs e) { string filename; try { filename = "KK-" + txt_karekod_icerik.Lines[0] + ".jpg"; } catch (IndexOutOfRangeException) // textbox un ilk satırında yazılı bir şey yok ise... { filename = "KK-" + DateTime.Now.ToString() + ".jpg"; } if (pc_karekod.Image != null) { SaveFileDialog sf = new SaveFileDialog() { Title = "Kaydet", RestoreDirectory = true, Filter = "JPG Dosyası |*.jpg", FileName = filename, }; if (sf.ShowDialog() == DialogResult.OK) { pc_karekod.Image.Save(sf.FileName, ImageFormat.Jpeg); MessageBox.Show("KareKod kaydedildi.", "Başarılı!", MessageBoxButtons.OK, MessageBoxIcon.Information); } } else MessageBox.Show("Oluşturulmuş bir Karekod bulunamadı.", "Hata!", MessageBoxButtons.OK, MessageBoxIcon.Error); }
Kodlarımızın hepsi bu kadar arkadaşlar.
C# Karekod Oluşturma ve Okuma yazımda bu kadar arkadaşlar. Bir örnek projemizin daha sonuna geldik.
C Sharp Eğitim Seti eğitimi sayfasına gitmek için tıklayınız. Derslerime özel olarak hazırladığım Github Projeme bu bağlantıdan ulaşabilirsiniz… Bu yazıda anlatılan proje ve DLL dosyalarına bağlantıya tıklayarak ulaşabilirsiniz.
Bu yazı, sitemdeki 426. yazıdır…
Sağlıcakla ve takipte kalın. ;)
Düzgün çalışmıyor sanki
Sanki?