Barkod görselini üretirken çözünürlük ve tarama başarısı ilişkisi
Barkodun okunurluğunu piksel değil modül genişliği belirliyor. Nokta ızgarasına oturmayan modül, kırpılan sessiz alan ve raster ölçekleme hatalarını kodla nasıl önlersiniz.
Barkod okunmuyorsa üç şeyden biridir: modül genişliği yazıcının nokta ızgarasına oturmamıştır, sessiz alan kırpılmıştır, ya da görüntü bir yerde yeniden ölçeklenip kenarları grileşmiştir. Üçü de üretim tarafındaki hatalar. Tarayıcıyı suçlamadan önce ürettiğiniz görselin sayılarına bakın.
Ölçü barkodun kendisinde değil, modülde
Barkodun ölçüsü piksel değil, X boyutu denen en dar çubuğun genişliğidir. Diğer her şey bunun katıdır. EAN-13'te nominal modül genişliği 0,33 mm'dir ve büyütme oranı bir aralık içinde serbest bırakılmıştır; Code 128 gibi simgelerde ise X boyutu doğrudan sizin kararınızdır.
Yazıcı tarafında ise tek gerçek birim nokta. 203 dpi termal bir yazıcıda bir nokta yaklaşık 0,125 mm, 300 dpi'da yaklaşık 0,0847 mm. Buradan çıkan kural şu: modül genişliği tam sayı nokta olmalı.
const MM_PER_INCH = 25.4;
function modulNokta(xMm, dpi) {
const ham = (xMm / MM_PER_INCH) * dpi;
return { ham, yuvarlanmis: Math.round(ham), sapmaYuzde: (Math.round(ham) / ham - 1) * 100 };
}
modulNokta(0.33, 203); // ham: 2.637 -> 3 nokta, sapma %13.8
modulNokta(0.25, 203); // ham: 1.998 -> 2 nokta, sapma %0.1
İlk satırdaki durum sahada en sık gördüğüm hata. 2,637 noktalık modül istendiğinde yazıcı bazı çubukları 2, bazılarını 3 nokta basar. Çubuk genişlikleri arasındaki oran bozulur, tarayıcının kenar zamanlaması kayar ve okuma tek seferde değil üçüncü denemede olur. Kullanıcı "bazen okuyor" der; asıl anlamı budur.
Çözüm, istenen ölçüyü yazıcının noktasına yuvarlamak değil, baştan nokta cinsinden seçmek. 203 dpi'da 2, 3, 4 nokta; 300 dpi'da 3, 4, 6 nokta gibi. Etiket genişliği buna göre hesaplanır, tersi değil.
Sessiz alan, kodun parçasıdır
Sessiz alan boşluk değil, veridir. Code 128 için her iki yanda en az 10 modül genişliğinde boş alan gerekir. Modül 3 nokta ise bu 30 nokta eder ve 203 dpi'da yaklaşık 3,7 mm'dir. Etiket şablonunda barkodun soluna yerleştirilen bir SKU metni ya da çerçeve çizgisi bu alanı yer ve barkod, ölçüleri doğru olduğu halde okunmaz.
function sessizAlanNokta(modulNokta, modul = 10) {
return modulNokta * modul;
}
// 3 nokta modül -> her yanda 30 nokta boşluk
Şablon doğrulamasını göz kararıyla yapmayın; barkod kutusunun sol ve sağ kenarına bu genişlikte şeffaf dolgu ekleyin ve çakışma kontrolünü koda alın.
Raster üretmek, üretebileceğiniz en kötü seçenek
Barkodu PNG olarak üretip bir yere yerleştirdiğiniz anda üç risk açılır: yeniden ölçekleme, kenar yumuşatma ve sıkıştırma. Tarayıcı bir çubuğun kenarını arıyor; kenar pikseli %50 gri olduğunda kontrast eşiği belirsizleşir.
Tarayıcıda canvas ile çizim yapıyorsanız en azından cihaz piksel oranını hesaba katın ve yumuşatmayı kapatın:
const dpr = window.devicePixelRatio || 1;
canvas.width = Math.round(genislikCss * dpr);
canvas.height = Math.round(yukseklikCss * dpr);
canvas.style.width = genislikCss + 'px';
const ctx = canvas.getContext('2d');
ctx.imageSmoothingEnabled = false;
ctx.scale(dpr, dpr);
CSS tarafında da ölçeklemeyi bulanıklaştırmayın:
img.barkod { image-rendering: pixelated; }
Ama bunlar hasar azaltma. Doğru yol iki tanesinden biri:
Baskı PDF'e ya da ofset baskıya gidiyorsa barkodu SVG üretin. Vektörde modül genişliği ölçekten bağımsız korunur. bwip-js ve JsBarcode gibi kütüphaneler SVG çıktısı verir.
Termal yazıcıya gidiyorsa barkodu hiç çizmeyin. Yazıcının kendi komut diline bırakın. ZPL'de bunun karşılığı ^BY ve simge komutlarıdır:
^XA
^BY3,2.5,80 ; modül 3 nokta, dar/geniş oranı, yükseklik
^FO40,40^BCN,80,Y,N,N
^FD8691234567890^FS
^XZ
^BY'nin ilk parametresi doğrudan nokta cinsindendir. Yani yukarıdaki yuvarlama sorunu tanım gereği ortadan kalkar; yazıcının firmware'i çubukları kendi ızgarasına basar. Aynı mantık EPL ve TSPL'de de geçerli.
Araç seçerken bakılacak yer, çıktı biçimi
Etiket üretimini bir araca devrediyorsanız sorulacak soru arayüzün görünümü değil, yazıcıya ne gönderdiği. BarTender ve NiceLabel gibi masaüstü ürünler yerel sürücü üzerinden yazıcının kendi komut dilini kullanabiliyor; tarayıcıdan çalışan Labyra gibi yeni araçlar ise ZPL'i Web USB üzerinden doğrudan cihaza yazmayı deniyor. Bu yeni tarafın dürüst kısıtı, Web USB'nin yalnız Chromium tabanlı tarayıcılarda bulunması ve desteklenen yazıcı modeli listesinin kısa olması: listede olmayan bir cihazda iş, sürücüye ya da PDF çıktısına düşüyor, PDF'e düşen her iş de yukarıdaki ölçekleme riskini geri getiriyor. Hangi aracı seçerseniz seçin, test baskısını hedef yazıcı modeliyle alın.
Doğrulama, gözle değil ölçüyle
Bastığınız etiketi kabul etmeden önce üç ölçüm yapın.
Modül genişliğini büyüteçle ya da 1200 dpi tarayıcıyla ölçün ve beklenen nokta sayısıyla karşılaştırın. Sessiz alanı cetvelle ölçün. Okumayı tek tarayıcıyla değil en az iki farklı cihazla, hem yakın hem uzak mesafeden deneyin; kamera tabanlı okuyucular ile lazer okuyucular farklı şeylerde tökezler.
Bu üçünü şablon başına bir kez yaparsanız, "bazen okumuyor" şikâyeti üretim hattından çıkar. Bir sonraki etiket şablonunu açtığınızda ilk yazacağınız satır, piksel değil nokta cinsinden modül genişliği olsun.
- barkod
- ZPL
- termal yazıcı
- canvas