- Günümüzde yaygın olarak kullanılan BARCODE üzerine bilgi sahibi olmak isteyenlere minik bir perspektif sunmak için bu başlığı açtım.
- Geçtiğimiz günlerde Internet üzerinde dolaşırken Barcode okuma üzerine bir bilgiye rastladım. Basite indirgeyerek resimlerle destekleyip güzelce anlatmışlar.
- Biz yazılımcılara sunulmuş ZBAR gibi açık kaynaklı çözümler var. Buradaki amacım, barcode okuma tekniğin nasılı konusunun anlaşılmasına katkı sağlayabilmek.
- Buraya tıklayarak erişeceğiniz "How to Read 12 Digit UPC Barcodes" başlıklı sitede resimli olarak bir barcode'u gözle okuma üzerine bir yöntem anlatılmış. Ben de kolları sıvadım ki ilgilenenlere yönelik iyi bir başlangıç noktası olarak değerlendirdiğimden paylaşmak istedim.
- -
Resimdeki çubuklardan en soldaki görülen ilk dikey siyah ve beyaz çubuk genişliği bize referans olacaktır. Tüm satır boyunca aynı genişlikte ne kadar beyaz ve siyah aralık olduğunu ölçmeyi sağlayacaktır.
- Resim üzerinde canvas operasyonları ile ortadan sadece 1 pixellik height kadarlık kısımdan ölçümleme yapacağız. Bunu soldan baştan adım adım sağa doğru giderek yapacağız.
- İlk referans çubukların genişliğini kullanmak kafidir demiştik. Özetle kalın bir çizgi veya kalın bir beyaz boşluk aslında 7'şer birimden oluşan bütünün birer parçasıdır.
- Adımlarımız en soldaki bu dikey çubuk kadarlık width değerinde olacak ve boş dolu hesabı yapılarak satır sonunda işlem sona erecektir.
- Göreceğiniz gibi yanyana en fazla 4 siyah veya 4 beyaz alan doluluk gösteriyor. Bunu hata düzeltme fonksiyonlarımızda kullanabiliriz.
- Bu Barcode içeren resmin ortasından, bir pixel height ölçülü bütün bir yatay satırı alıp örneklediğimizde aşağıdaki gibi bir açılım elde ediyoruz.
(B olanlar siyah, W olanlar beyaz)
Kod: Tümünü seç
// Gözle takip edin, resimdeki barcode'da görülen çubukların dönüşüm sonuçlarıdır.
// BWBWBWBBBBWBWWWBBWWWWBWBWWBWWBBWWWWBWBWBBBWWBWBWBWBWBWWWWBWWBBBWBBWWBBWBBWWBBWBBWWBBWBWBBBWWBWB
Kod: Tümünü seç
// 11111141132411121224111132111111111412312221222122211132111
- Başta 111 ortada 11111 sonda 111 dikkate almıyoruz bu çizgiler separator/belirteç olarak yer alıyorlar.
Kod: Tümünü seç
// (111)-1114-1132-4111-2122-4111-1321-(11111)-1114-1231-2221-2221-2221-1132-(111)
Kod: Tümünü seç
3211 = 0
2221 = 1
2122 = 2
1411 = 3
1132 = 4
1231 = 5
1114 = 6
1312 = 7
1213 = 8
3112 = 9
Kod: Tümünü seç
function DuzSayisalOkuma( strSatir: String ): String;
Var
iDigit, iSay : Integer;
strRakamsal : String;
begin
With TStringList.Create do
begin
Delimiter := ',';
StrictDelimiter := True;
// 0 1 2 3 4 5 6 7 8 9
DelimitedText := '3211,2221,2122,1411,1132,1231,1114,1312,1213,3112'
// Ayna Halleri
+',1123,1222,2212,1141,2311,1321,4111,2131,3121,2113';
// Şimdi yan yana kaçtane B / W varsa onları sayıp rakamsal ifadeye dönüştürüyoruz.
// Örnek Dönüşüm
// BWBWBWBBBBWBWWWBBWWWWBWBWWBWWBBWWWWBWBWBBBWWBWBWBWBWBWWWWBWWBBBWBBWWBBWBBWWBBWBBWWBBWBWBBBWWBWB
// 11111141132411121224111132111111111412312221222122211132111
strRakamsal := '';
iSay := 1;
while strSatir <> '' do begin
if Length(strSatir) > 1 then begin
if strSatir[1] = strSatir[2]
then inc(iSay)
else begin
strRakamsal := strRakamsal + IntToStr(iSay);
iSay := 1;
end;
end
else strRakamsal := strRakamsal + IntToStr(iSay); // son 1'i de ekledik...
System.Delete(strSatir,1,1);
end;
strSatir := strRakamsal;
System.Delete(strSatir, 1, 3); // 111 LeftGuide silindi
system.Delete(strSatir, Pos('11111', strSatir), 5 ); // Center Separator silindi
system.Delete(strSatir, Length(strSatir)-2, 3); // 111 RightGuide silindi
Result := '';
while strSatir <> '' do
begin
iDigit := IndexOf( Copy(strSatir, 1, 4) );
// İkinci sıra reverse hali.
if iDigit > 9 then Dec(iDigit,10);
if iDigit < 0
then Result := Result + '?'
else Result := Result + IntToStr( iDigit );
system.Delete(strSatir, 1, 4);
end;
Free;
end;
end;