diff --git a/data.py b/data.py index d4d38d8..2a74c00 100644 --- a/data.py +++ b/data.py @@ -38,7 +38,7 @@ def encode(ecl, str): for n in range(g[2]): data_codewords.append(data_code[i:i+g[3]]) i += g[3] - + return ver, data_codewords def analyse(ecl, str): diff --git a/ecc.py b/ecc.py index 522645b..0f5b919 100644 --- a/ecc.py +++ b/ecc.py @@ -27,10 +27,11 @@ def divide(MP, *GP): GP[i] %= 255 GP[i] = po2[GP[i]] - return XOR(MP, GP) + return XOR(GP, *MP) -def XOR(MP, GP): +def XOR(GP, *MP): + MP = list(MP) a = len(MP) - len(GP) if a < 0: MP += [0] * (-a) diff --git a/matrix.py b/matrix.py index eca2d99..dcabad8 100644 --- a/matrix.py +++ b/matrix.py @@ -18,10 +18,15 @@ def get_qrmatrix(ver, ecl, bits): # Add the Dark Module and Reserved Areas add_dark_and_reserving(ver, qrmatrix) + maskmatrix = [i[:] for i in qrmatrix] + # Place the Data Bits place_bits(bits, qrmatrix) # Data Masking + mask_num, qrmatrix = mask(maskmatrix, qrmatrix) + + # Format and Version Information return qrmatrix @@ -57,15 +62,16 @@ def add_timing(m): m[i][6] = m[6][i] = 1 if i % 2 ==0 else 0 def add_dark_and_reserving(ver, m): - for j in range(9): + for j in range(8): m[8][j] = m[8][-j-1] = m[j][8] = m[-j-1][8] = 0 + m[8][8] = 0 m[8][6] = m[6][8] = m[-8][8] = 1 if ver > 6: for i in range(6): for j in (-9, -10, -11): m[i][j] = m[j][i] = 0 - + def place_bits(bits, m): bit = (int(i) for i in bits) @@ -79,7 +85,83 @@ def place_bits(bits, m): m[i][j] = next(bit) up = not up -if __name__ == '__main__': - m = get_qrmatrix(7,'H',1) - for i in range(len(m)): - print(m[i]) \ No newline at end of file +def mask(mm, m): + mps = get_mask_patterns(mm) + scores = [] + for mp in mps: + for i in len(mp): + for j in len(mp): + mp[i][j] = mp[i][j] ^ m[i][j] + scores.append(compute_score(mp)) + best = scores.index(min(scores)) + return best, mps[best] + + +def get_mask_patterns(mm): + mm[-8][8] = None + for i in range(len(mm)): + for j in range(len(mm)): + mm[i][j] = 0 if mm[i][j] is not None else mm[i][j] + mps = [] + for i in range(8): + mp = [ii[:] for ii in mm] + for row in len(mp): + for column in len(mp): + mp[row][column] = 1 if mp[row][column] is None and formula(i, row, column) else 0 + mps.append(mp) + + return mps + + def formula(i, row, column): + if i == 0: + return (row + column) % 2 == 0 + elif i == 1: + return row % 2 == 0 + elif i == 2: + return column % 3 == 0 + elif i == 3: + return (row + column) % 3 == 0 + elif i == 4: + return + elif i == 5: + return ((row * column) % 2) + ((row * column) % 3) == 0 + elif i == 6: + return (((row * column) % 2) + ((row * column) % 3)) % 2 == 0 + elif i == 7: + return (((row + column) % 2) + ((row * column) % 3)) % 2 == 0 + +def compute_score(m): + score = evaluation1(m) + evaluation2(m)+ evalutaion3(m) + evaluation4(m) + return score + + def evaluation1(m): + def ev1(ma): + sc = 0 + for mi in ma: + j = 0 + while j < len(mi)-4: + n = 4 + while mi[j:j+n+1] in [[1]*(n+1), [0]*(n+1)]: + n += 1 + (sc, j) = (sc+n-2, j+n) if n > 4 else (sc, j+1) + return sc + return ev1(m) + ev1(list(map(list, zip(*m)))) + + def evaluation2(m): + sc = 0 + for i in range(len(m)-1): + for j in range(len(m)-1): + sc += 3 if m[i][j] == m[i+1][j] == m[i][j+1] == m[i+1][j+1] else 0 + return sc + + def evaluation3(m): + pass + + def evaluation4(m): + darknum = 0 + for i in m: + darknum += sum(i) + + percent = darknum / (len(m)**2) * 100 + (50 - percent) / 5 * 5 + \ No newline at end of file diff --git a/myqrcode.py b/myqrcode.py index 9804f63..72cba4a 100644 --- a/myqrcode.py +++ b/myqrcode.py @@ -7,17 +7,22 @@ def get_qrcode(ecl, str): try: # Data Coding ver, data_codewords = data.encode(ecl, str) + ndc = 0 + for i in range(len(data_codewords)): + ndc += len(data_codewords[i]) # Error Correction Coding ecc = ECC.encode(ver, ecl, data_codewords) + ndc = 0 + for i in range(len(data_codewords)): + ndc += len(data_codewords[i]) # Structure final bits final_bits = structure.structure_final_bits(ver, ecl, data_codewords, ecc) # Get the QR Matrix qrmatrix = matrix.get_qrmatrix(ver, ecl, final_bits) - for i in qrmatrix: - print(i) + # Draw the picture draw.draw_qrcode(qrmatrix)