You've already forked amazing-qr
mirror of
https://github.com/x-hw/amazing-qr.git
synced 2025-07-09 01:05:34 +02:00
code more
This commit is contained in:
2
data.py
2
data.py
@ -38,7 +38,7 @@ def encode(ecl, str):
|
|||||||
for n in range(g[2]):
|
for n in range(g[2]):
|
||||||
data_codewords.append(data_code[i:i+g[3]])
|
data_codewords.append(data_code[i:i+g[3]])
|
||||||
i += g[3]
|
i += g[3]
|
||||||
|
|
||||||
return ver, data_codewords
|
return ver, data_codewords
|
||||||
|
|
||||||
def analyse(ecl, str):
|
def analyse(ecl, str):
|
||||||
|
5
ecc.py
5
ecc.py
@ -27,10 +27,11 @@ def divide(MP, *GP):
|
|||||||
GP[i] %= 255
|
GP[i] %= 255
|
||||||
GP[i] = po2[GP[i]]
|
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)
|
a = len(MP) - len(GP)
|
||||||
if a < 0:
|
if a < 0:
|
||||||
MP += [0] * (-a)
|
MP += [0] * (-a)
|
||||||
|
94
matrix.py
94
matrix.py
@ -18,10 +18,15 @@ def get_qrmatrix(ver, ecl, bits):
|
|||||||
# Add the Dark Module and Reserved Areas
|
# Add the Dark Module and Reserved Areas
|
||||||
add_dark_and_reserving(ver, qrmatrix)
|
add_dark_and_reserving(ver, qrmatrix)
|
||||||
|
|
||||||
|
maskmatrix = [i[:] for i in qrmatrix]
|
||||||
|
|
||||||
# Place the Data Bits
|
# Place the Data Bits
|
||||||
place_bits(bits, qrmatrix)
|
place_bits(bits, qrmatrix)
|
||||||
|
|
||||||
# Data Masking
|
# Data Masking
|
||||||
|
mask_num, qrmatrix = mask(maskmatrix, qrmatrix)
|
||||||
|
|
||||||
|
# Format and Version Information
|
||||||
|
|
||||||
|
|
||||||
return qrmatrix
|
return qrmatrix
|
||||||
@ -57,15 +62,16 @@ def add_timing(m):
|
|||||||
m[i][6] = m[6][i] = 1 if i % 2 ==0 else 0
|
m[i][6] = m[6][i] = 1 if i % 2 ==0 else 0
|
||||||
|
|
||||||
def add_dark_and_reserving(ver, m):
|
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][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
|
m[8][6] = m[6][8] = m[-8][8] = 1
|
||||||
|
|
||||||
if ver > 6:
|
if ver > 6:
|
||||||
for i in range(6):
|
for i in range(6):
|
||||||
for j in (-9, -10, -11):
|
for j in (-9, -10, -11):
|
||||||
m[i][j] = m[j][i] = 0
|
m[i][j] = m[j][i] = 0
|
||||||
|
|
||||||
def place_bits(bits, m):
|
def place_bits(bits, m):
|
||||||
bit = (int(i) for i in bits)
|
bit = (int(i) for i in bits)
|
||||||
|
|
||||||
@ -79,7 +85,83 @@ def place_bits(bits, m):
|
|||||||
m[i][j] = next(bit)
|
m[i][j] = next(bit)
|
||||||
up = not up
|
up = not up
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def mask(mm, m):
|
||||||
m = get_qrmatrix(7,'H',1)
|
mps = get_mask_patterns(mm)
|
||||||
for i in range(len(m)):
|
scores = []
|
||||||
print(m[i])
|
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
|
||||||
|
|
@ -7,17 +7,22 @@ def get_qrcode(ecl, str):
|
|||||||
try:
|
try:
|
||||||
# Data Coding
|
# Data Coding
|
||||||
ver, data_codewords = data.encode(ecl, str)
|
ver, data_codewords = data.encode(ecl, str)
|
||||||
|
ndc = 0
|
||||||
|
for i in range(len(data_codewords)):
|
||||||
|
ndc += len(data_codewords[i])
|
||||||
|
|
||||||
# Error Correction Coding
|
# Error Correction Coding
|
||||||
ecc = ECC.encode(ver, ecl, data_codewords)
|
ecc = ECC.encode(ver, ecl, data_codewords)
|
||||||
|
ndc = 0
|
||||||
|
for i in range(len(data_codewords)):
|
||||||
|
ndc += len(data_codewords[i])
|
||||||
|
|
||||||
# Structure final bits
|
# Structure final bits
|
||||||
final_bits = structure.structure_final_bits(ver, ecl, data_codewords, ecc)
|
final_bits = structure.structure_final_bits(ver, ecl, data_codewords, ecc)
|
||||||
|
|
||||||
# Get the QR Matrix
|
# Get the QR Matrix
|
||||||
qrmatrix = matrix.get_qrmatrix(ver, ecl, final_bits)
|
qrmatrix = matrix.get_qrmatrix(ver, ecl, final_bits)
|
||||||
for i in qrmatrix:
|
|
||||||
print(i)
|
|
||||||
# Draw the picture
|
# Draw the picture
|
||||||
draw.draw_qrcode(qrmatrix)
|
draw.draw_qrcode(qrmatrix)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user