/* * Copyright (c) 2010 Tobias Schneider * This script is freely distributable under the terms of the MIT license. */ (function(){ var UPC_SET = { "3211": '0', "2221": '1', "2122": '2', "1411": '3', "1132": '4', "1231": '5', "1114": '6', "1312": '7', "1213": '8', "3112": '9' }; getBarcodeFromImage = function(imgOrId){ var doc = document, img = "object" == typeof imgOrId ? imgOrId : doc.getElementById(imgOrId), canvas = doc.createElement("canvas"), ctx = canvas.getContext("2d"), width = img.width, height = img.height, numLines = 3, slineStep = height / (numLines + 1); canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0); while(numLines--){ var pxLine = ctx.getImageData(0, slineStep * numLines, width, 2).data, sum = [], min = 0, max = 0; for(var row = 0; row < 2; row++){ for(var col = 0; col < width; col++){ var i = ((row * width) + col) * 4, g = ((pxLine[i] * 3) + (pxLine[i + 1] * 4) + (pxLine[i + 2] * 2)) / 9, s = sum[col]; pxLine[i] = pxLine[i + 1] = pxLine[i + 2] = g; sum[col] = g + (undefined == s ? 0 : s); } } for(var i = 0; i < width; i++){ var s = sum[i] = sum[i] / 2; if(s < min){ min = s; } if(s > max){ max = s; } } var pivot = min + ((max - min) / 2), bmp = []; for(var col = 0; col < width; col++){ var matches = 0; for(var row = 0; row < 2; row++){ if(pxLine[((row * width) + col) * 4] > pivot){ matches++; } } bmp.push(matches > 1); } var curr = bmp[0], count = 1, lines = []; for(var col = 0; col < width; col++){ if(bmp[col] == curr){ count++; } else{ lines.push(count); count = 1; curr = bmp[col]; } } var code = '', bar = Math.round((lines[1] + lines[2] + lines[3]) / 3), u = UPC_SET; for(var i = 1, l = lines.length; i < l; i++){ if(code.length < 6){ var group = lines.slice(i * 4, (i * 4) + 4); } else{ var group = lines.slice((i * 4 ) + 5, (i * 4) + 9); } var digits = '' + Math.round(group[0] / bar) + Math.round(group[1] / bar) + Math.round(group[2] / bar) + Math.round(group[3] / bar), invert = '' + Math.round(group[3] / bar) + Math.round(group[2] / bar) + Math.round(group[1] / bar) + Math.round(group[0] / bar); code += u[digits] || u[invert] || 'X'; if(12 == code.length){ break; } } if(-1 == code.indexOf('X')){ return code; } } return false; } })();