Bir QR kod, kameranın uzun bir birler ve sıfırlar dizisi olarak okuduğu, siyah ve beyaz karelerden oluşan bir ızgaradan ibarettir. Köşelerdeki üç büyük kare telefonunuza kodun nerede olduğunu ve hangi yönde durduğunu söyler; geri kalan desen ise verinizi ve kodun çiziklere, lekelere, çıkartmalara rağmen okunabilmesini sağlayan yedek kopyaları taşır. Şimdi her parçanın nasıl çalıştığına sade bir dille bakalım.
Kamera görüntüsünden modül ızgarasına
Kameranızı bir QR koda doğrultduğunuzda uygulamanın ilk işi, fotoğrafı bilgisayarın işleyebileceği bir hâle dönüştürmektir. Görüntü, bir parlaklık eşiği belirlenerek siyah beyaza çevrilir: çizginin altında kalan her şey siyah, üstünde kalan her şey beyaz olur. Bulanık ya da gölgeli fotoğraflar bu adımı zorlaştırır; bu yüzden net ve iyi ışıklı bir kod daha güvenilir okunur.
Desendeki en küçük kareye modül denir. Okuyucu için her modül tek bir bittir — koyu modül bir ikili değer, açık modül öbürüdür. Aşağıda göreceğiniz her şey, büyük köşe karelerinden verinin kendisine kadar, ızgara üzerine dizilmiş modüllerden başka bir şey değildir.
Kodun çevresinde quiet zone adı verilen boş bir kenar boşluğu bulunur; geleneksel olarak dört modül genişliğindedir. Kameraya temiz bir kenar verir ve kodu kalabalık arka plandan ayırır. Kodun başka grafiklere bitişik basılması tam da bu yüzden okumayı zorlaştırır.
Üç finder deseni
Üç köşede — sol üstte, sağ üstte ve sol altta — QR kodun en ayırt edici özelliğini görürsünüz: koyu bir dış halka, bir açık halka ve sağlam koyu bir 3×3 merkezden oluşan iç içe halkalardan kurulu büyük bir kare. Bunlar finder desenleridir ve her okuyucunun karşısına çıkan ilk sorunu çözerler: kod nerede, hangi yönde?
Tarayıcı bunları, görüntü üzerinde bir çizgi gezdirip çok belirli bir ritim arayarak bulur. Bir finder deseninin ortasından geçen çizgi, genişlikleri 1:1:3:1:1 oranında olan koyu–açık–koyu–açık–koyu dizilimini keser: bir modül koyu, bir açık, üç koyu, sonra yine bir ve bir. Bu imza, fotoğraftaki neredeyse hiçbir şeyden farklılaşacak kadar özgündür.
Peki neden üç finder, dört değil? Bir kareyi sabitlemek için üç köşe yeterlidir ve eksik köşe anlam taşır: okuyucuya "yukarı"nın hangi yön olduğunu söyler. Kodu ters ya da yan tutup taramış olsanız bile okuyucu, çözmeye başlamadan önce ızgarayı tam olarak nasıl döndüreceğini bilir.
Zamanlama ve hizalama desenleri
Köşelerin yerini bilmek tek başına yeterli değildir. Kod açılı bir fotoğrafla çekildiyse ya da kavisli bir yüzeye basıldıysa aradaki ızgara gerilmiş ya da eğrilmiş olabilir. İki yapı daha bu durumu düzeltir.
Zamanlama deseni, finder desenleri arasında uzanan, koyu ve açık modüllerin dönüşümlü sıralandığı kesikli bir çizgidir — biri üstte, biri sol kenarda. Bir cetvel gibi çalışır: okuyucu bu dönüşümleri sayarak modüllerin tam boyutunu ve ızgaranın kodun tamamında nasıl aralanması gerektiğini doğrular.
Hizalama deseni ise beş modül genişliğinde, daha küçük bir iç içe karedir; 2. sürümden itibaren görünür ve sağ alta doğru yerleştirilir. Daha büyük kodlarda birkaç tane bulunur. Her biri ek bir işaret taşı gibi davranır ve okuyucunun ızgaranın kendi bölgesindeki bozulmayı ölçüp düzeltmesini sağlar — kod bir şişeye sarıldığında ya da hafif buruşmuş bir etiketteyken vazgeçilmezdir.
1'den 40'a sürümler
QR kodlar 40 ayrı boyutta gelir; bunlara sürüm denir. Sürüm 1, 21×21'lik bir modül ızgarasıdır. Her sonraki sürüm kenar başına dört modül ekler: sürüm 2 25×25, sürüm 3 29×29 olur ve sürüm 40'ta 177×177'ye kadar böyle gider.
Daha büyük ızgara, daha çok veri alanı demektir. Kaba bir kural olarak en büyük sürümler yaklaşık 7.000 rakam taşıyabilir; kısa bir bağlantı ise çok daha küçük bir koda rahatça sığar. Kesin kapasite, ne kodladığınıza — rakamlar metinden sıkışık yerleşir — ve seçtiğiniz hata düzeltme düzeyine de bağlıdır.
Üretilen kodların görünümünün bu kadar değişken olmasının nedeni de budur. Kodlama araçları içeriğin sığdığı en küçük sürümü seçer; kısa bir bağlantı seyrek ve geniş gözenekli bir kod üretirken, uzun bir bağlantı yoğun ve ince taneli bir desen üretir.
Veri ve hata düzeltme kod sözcükleri
Yapısal desenler yerlerini kapladığında, kalan alan yükü taşır. Bitler, kod sözcüğü (codeword) adı verilen sekiz modüllük birimlere gruplanır — her biri tek bir baytlık bilgidir.
İki tür vardır. Veri kod sözcükleri gerçek içeriğinizi taşır: bağlantı, metin ya da kodun ne kodluyorsa onu. Hata düzeltme kod sözcükleri ise zekice tasarlanmış yedeklerdir; Reed–Solomon kodlaması denen bir matematik dalıyla veriden hesaplanır — CD ve DVD'lerde veriyi koruyan tekniklerin ailesindendir. Okuyucu bunları veriyi denetlemek ve eksik olanları onarmak için kullanır.
QR kodlar L, M, Q ve H adlı dört hata düzeltme düzeyi sunar. Kabaca söylemek gerekirse sırasıyla kod sözcüklerin yaklaşık %7'sini, %15'ini, %25'ini veya %30'unu kurtarabilirler. Bedeli yerdir: düzey yükseldikçe kodun daha büyük bölümü yedeklere ayrılır ve veriye daha az alan kalır; aynı içerik daha büyük bir sürüm gerektirebilir.
Ortasına logo bindirilmiş bir QR kodun yine de okunabilmesinin nedeni budur: tasarımcı yüksek bir hata düzeltme düzeyi seçmiş ve kaplanan alanı yedek kod sözcüklerin emmesine bırakmıştır.
Maskeleme
Rastına bırakılırsa ham veri, göze batmayan bir ızgara üretebilir: geniş boş alanlar ya da yanlışlıkla bir finder desenini taklit edip tarayıcıyı şaşırtan kare kümeleri. Çözüm maskelemedir.
Kodlama aracı, sekiz önceden tanımlı maske deseninden birini alır — damalı desenler, yatay ya da dikey şeritler ve benzeri tekrarlı tasarımlar — ve maskenin koyu kare koyduğu her modülü ters çevirir. Verinin kendisi değişmez; yalnızca görünümü değişir ve çevirme tamamen geri alınabilir.
Araç sekiz maskenin hepsini dener, her sonucu ceza kurallarıyla puanlar (aynı rengin uzun dizileri, finder desenine benzeyen yapılar, koyu ve açık alanların aşırı dengesiz dağılımı) ve cezası en düşük olanı tutar. Hangi maskenin kullanıldığı, finderların yanındaki küçük bir biçim bilgisi şeridine kaydedilir — güvenlik için iki kez yazılır; böylece yıpranmış bir köşe okuyucuyu tahmin yürütmekle bırakmaz.
Aynı bağlantıyı iki farklı aracın kodlaması, görsel olarak birbirinden farklı iki kod üretebilir. İkisi de doğrudur; yalnızca farklı maskeler seçmişlerdir.
Küçük bir örnek
"HI" metnini ele alalım. Kodlayıcı önce birkaç kurulum biti yazar — ardından ne tür verinin geleceği ve ne kadar uzun olduğu — sonra da içeriğin kendisini. Her karakter sekiz bit olarak saklanır: H, 01001000 olur; I ise 01001001. Bu on altı bit, ızgarada her bit bir modül olmak üzere on altı modüle dönüşür.
Bitler, sağ alt köşeden yukarı ve aşağı kıvrılan iki sütunluk şeritler hâlinde ızgaraya yerleştirilir; finder, zamanlama ve biçim alanlarının üzerinden atlanır. Veriden sonra, ondan hesaplanan ve yanına yerleştirilen bir hata düzeltme kod sözcükleri bloğu gelir. Son olarak seçilen maske uygulanır ve şanssız desenleri dağıtmak için bazı modüller ters çevrilir.
Tarifin tamamı budur: önce yapı, sonra veri, sonra yedekler, sonra maske. Şimdiye kadar taramış olduğunuz her QR kod, daha büyük ölçekte yinelenen bu aynı işlemdir.
Ana fikir
QR kod, kendini anlatan bir resimdir. Finder desenleri "buradayım ve yönüm bu" der; zamanlama ve hizalama desenleri ızgarayı düzeltir; sürüm boyutu belirler; kod sözcükleri verinizi yerleşik yedekleriyle taşır; maskeleme de tüm deseni okunabilir tutar. Bir dahaki sefere bir kod taradığınızda — ya da QRCodeMax.Vip üzerinde kendiniz bir kod ürettiğinizde — yakınalaşın; bu parçaların hepsinin el ele çalıştığını göreceksiniz.