Dithering’li QR kod: bir fotoğraf nasıl okunabilir koda dönüşür
"Sanatsal" QR kodların çoğu, üstüne kod basılmış bir resimdir. Dithering’li QR kod başka bir şey: ortada tek bir görüntü vardır ve kod o görüntünün dokusunun parçasıdır. Bu yazı kodun gerçekte neye ihtiyacı olduğunu, hata yayılımlı dithering’in nasıl çalıştığını, ikisinin aynı kareyi paylaşmasını sağlayan tek değişikliği, sonucu belirleyen iki ayarı ve bozulduğu üç durumu anlatır.
Önce kodun gerçekten neye ihtiyacı var
QR kod, koyu ya da açık küçük karelerden — modüllerden — oluşan bir ızgaradır. Bunların bir kısmı yapısaldır ve yerinden oynayamaz: köşelerdeki üç büyük kare (tarayıcı kodu onlarla bulur ve yönünü onlarla anlar), aralarındaki ince şaşırtmalı çizgi, küçük hizalama kareleri, biçim ve sürüm bilgisini taşıyan şeritler. Gerisi veri ve hata düzeltme baytlarıdır. Açık kapı işte o hata düzeltmede. En yüksek seviyede kodun yaklaşık %30’u yok edilse bile okuyucu içeriği kurtarabiliyor. Yani kodun kusursuz olması gerekmiyor; önemli yerlerde kusursuz, geri kalanda yeterince yakın olması yetiyor. Bu ayrımı aklınızda tutun, çünkü bütün teknik onun üzerine kurulu: yapısal modüllere dokunulmaz sayılıyor, veri alanı ise kameranın gördüğü ölçekte yalnızca ortalamada doğru olması gereken bir şey olarak ele alınıyor. Kodun içine resim koyan her üreteç o %30’luk bütçenin bir kısmını harcıyor; soru yalnızca onu ne kadar özenle harcadığı ve gözün bedeli görüp görmediği.
Tek paragrafta dithering
Floyd–Steinberg dithering bir gri fotoğrafı saf siyah-beyaza çevirir. Pikselleri sırayla dolaşırsınız. Her biri için siyah ile beyazdan yakın olanı seçersiniz, sonra az önce yaptığınız hatayı — istediğiniz gri ile bastığınız değer arasındaki farkı — henüz uğramadığınız komşulara dağıtırsınız: sağdaki piksele 7/16, alttaki üç piksele 3/16, 5/16 ve 1/16 ağırlığında. O komşuların her biri kendi sırası geldiğinde biraz düzeltilmiş bir değerden başlar; böylece hata hiç kaybolmaz, yalnızca taşınır. Fotoğraf, yerel yoğunluğu özgün parlaklığa denk düşen bir benek tarlası olarak çıkar: orta gri bir bölge kabaca yarı yarıya siyah noktaya, bir parlaklık beyaz üstünde seyrek noktalara, bir gölge siyah üstünde seyrek beyaz noktalara dönüşür. Uzaktan bakıldığında göz beneği yeniden tona ortalar; dithering’li bir görüntünün içindeki her piksel yalnızca iki renkten biri olduğu hâlde fotoğraf gibi okunmasının sebebi budur. O ortalama, kameranın küçük bir baskıya bakarken yaptığı şeyin aynısıdır ve tekniğin sömürdüğü şey de budur.
Numara
Kodu modül başına sabit sayıda pikselle çizin — SWAPQR dokuz kullanıyor, yani her modül 9×9’luk bir blok. Sonra fotoğrafı bütün karenin üzerinde dither’layın; tek fark şu: kodun belirli bir değer dayattığı yerde eşikleme yapmayın. Pikseli kodun istediği değere zorlayın, bu zorlamanın yarattığı hatayı ölçün ve tıpkı diğer hatalar gibi komşulara yayın. Bütün fikir o son cümlede. Zorlanan noktalar resmin üstüne boyanmıyor; bedelini etraflarındaki pikseller ödüyor, onlar dengelemek için kayıyor. Böylece zorlanan noktalar da her şeyle aynı tuz-biber dokusunun içine düşüyor ve gözün onları ayıracak bir tutamağı kalmıyor. Yapısal modüller — göz desenleri, zamanlama, hizalama, biçim — dokunulmadan, dolu çiziliyor: çünkü hata düzeltmenin devreye girebilmesi için tarayıcının kodu önce bulması gerekiyor. Burada anlatılan yöntem, dithering’li QR üretimini 2026’da yazan Andrew T.’nin yaklaşımını izliyor; SWAPQR’ın uygulaması, kaynağı kopyalanarak değil anlatımdan yazıldı.
Her şeyi belirleyen iki ayar
Birincisi, her modülün ne kadarının zorlandığı. Sadece merkez pikseli zorlarsanız resim neredeyse el değmemiş kalır ama kod kırılgan olur: modül başına tek pikselin yazıcıyla kamera sensörü arasındaki her yeniden örnekleme adımından sağ çıkması gerekir. 9×9’un içinde 7×7’lik bir blok zorlarsanız kod sağlam, resim soluk olur; çünkü artık her modülün çoğu doludur. SWAPQR bunu doğrudan bir Fotoğraf ↔ Kod dengesi olarak veriyor — Fotoğraf, Orta ve Kod konumlarıyla — böylece takas üretecin içinde saklı bir sabit değil sizin yaptığınız bir seçim oluyor. İkincisi, her modülün ne kadar itildiği. Dithering’den önce koyu bir modülün bütün pikselleri biraz koyulaştırılıyor, açık modülünkiler biraz açılıyor. Resim ayrıntısını koruyor ama modülün ortalama tonu doğru tarafa yatıyor — küçük basılmış bir koda odanın öbür ucundan bakan kamera tam olarak bunu görüyor. Bu iki ayar birlikte, sonucun içinde soluk bir kod olan bir fotoğraf mı yoksa içinde soluk bir fotoğraf olan bir kod mu olacağına karar veriyor; belirli bir baskının o çizginin neresinde durması gerektiği ise nasıl okutulacağına bağlı.
Nerede bozuluyor ve değer mi
Üç arıza; üçü de gerçek, hiçbiri gizemli değil. Düz fotoğraf: eşit ışıklı, tek tonlu bir görsel düzenli bir dama desenine dönüşüyor; bu da kodla en çok yarışan doku. Bu yüzden görselin gerçek bir açık-koyu aralığı olmalı ve stüdyo olmadığında uyarıyor. Uzun bağlantı: karakter arttıkça aynı kareye daha çok modül sığıyor, her modüle daha az resim düşüyor. Kabaca sürüm 8’den sonra — 49×49 modül — fotoğrafın yaşayacağı yer kalmıyor; çözüm kısa yönlendirme bağlantısı. Ve bazı okuyucularda çok yakın çekim; bu o kadar beklenmedik ki bu rehberde ayrı bir yazısı var. Sanatsal kod her zaman okunabilirlikten verilen bir tavizdir. Kodun tasarımın parçası olduğu ve birinin onu bilerek okutacağı yerlerde hak ediyor: afiş, albüm kapağı, ambalaj, kartvizit. Yangın çıkışı tabelasında işi yok. Hangisi olursa olsun, bin adet bastırmadan önce basılı örneği gerçek bir telefonla deneyin; stüdyo dışa aktar düğmesinin yanında aynı şeyi söylüyor ve ciddi.
| Kodun parçası | Dithering’li kodda muamelesi | Neden |
|---|---|---|
| Göz desenleri (üç köşe karesi) | Dolu çizilir, hiç dither’lanmaz | Tarayıcı her şeyden önce kodu bulmalı ve yönünü anlamalı |
| Zamanlama çizgisi, hizalama kareleri, biçim ve sürüm şeritleri | Dolu çizilir, hiç dither’lanmaz | Yapısal; hata düzeltme bulunamayan bir kodu onaramaz |
| Veri ve hata düzeltme modülleri | Her modülün merkezinde bir blok zorlanır, kalanı fotoğrafı taşır | Kameranın tarama mesafesinden gördüğü şey modülün ortalama tonudur |
| Zorlanan bloğun etrafındaki pikseller | Dengelemek için hata yayılımıyla kaydırılır | Yerel ortalamayı doğru tutar ki zorlanan noktalar beneğin içinde saklansın |
| Sessiz bölge | Açık, dokunulmamış | Tarayıcılar kodun kenarını bulmak için boş kenar boşluğunu kullanır |
Sık sorulan sorular
Fotoğraf sadece kodun arkasına mı konuyor?
Hayır. Kod ve fotoğraf tek geçişte üretiliyor: resim dither’lanıyor ve kodun bir değer istediği yerde piksel zorlanıp hatası komşulara yayılıyor. Ortada bir katmanın üstündeki başka bir katman değil, tek bir görüntü var.
Neden modül başına dokuz piksel?
Her modüle 9×9’luk bir blok veriyor; değişken boyutlu zorlanmış bir çekirdeği barındırıp resme yine de piksel bırakacak kadar büyük. O bloğun ne kadarının zorlanacağına denge ayarı karar veriyor.
Sıradan telefonlarla okunuyor mu?
Evet, tasarlandığı içerikler ve görseller için; ve her derleme yedi taklit kamera mesafesinde iki bağımsız çözücüyle sınanıyor. Yine de okunabilirlikten verilen bir taviz, o yüzden bir tane basıp kendi telefonunuzla deneyin.
Uzun bağlantı resmi neden bozuyor?
Uzun metin daha yüksek sürüm demek, yani aynı karede daha çok ve daha küçük modül. Her modüle fotoğraf pikseli için daha az yer kalıyor ve kabaca 49×49 modülden sonra resim kayboluyor. Kısa bir yönlendirme bağlantısı kullanın.
Kareyi bir kez bas. Nereye gideceğine sonra karar ver. SWAPQR statik QR kodları ücretsiz üretir; bütün stil seçenekleri dahil, hesap yok, filigran yok. Ücretli plan bir kodu dinamik yapar: basılı kare aynı kalırken hedefini değiştirirsin ve ne sıklıkla okutulduğunu güne ve cihaza göre görürsün.
Tarayıcıda QR kod oluştur