Divide un QR en trozos y ciertas posiciones las permuta hasta obtener un resultado QR válido
from PIL import Image, ImageDraw | |
import qrtools | |
import random | |
import math | |
fixed_pic = [[2,3,6,8,11],[0,1,12,15,3]] #Se mueven las imagenes indice [0] de la lista a indice [1] | |
permit_pic = range(16) | |
for row in fixed_pic[1]: | |
permit_pic.remove(row) | |
print("Se van a permutar las siguientes posiciones {}".format(str(permit_pic))) | |
def move_mosaic(a, fixed_pic): | |
""" | |
Mueve segun las permutaciones que definimos para reducir la probabilidad | |
""" | |
for row in range(len(fixed_pic[0])): | |
aux = a[fixed_pic[1][row]] | |
a[fixed_pic[1][row]] = a[fixed_pic[0][row]] | |
a[fixed_pic[0][row]] = aux | |
return a | |
def randomList(a, permit_pic): | |
""" | |
Mueve de los cuadros permitidos un cuadro | |
""" | |
magic1 = random.choice(permit_pic) | |
magic2 = random.choice(permit_pic) | |
aux = a[magic1] | |
a[magic1] = a[magic2] | |
a[magic2] = aux | |
return a | |
img = Image.open("qr_mosaic.jpg") | |
# se define alto y ancho de las cuadriculas | |
size_w = img.size[0]/4 | |
size_h = img.size[1]/4 | |
print("Se corta imagen") | |
images_array = [] | |
for row in range(4): | |
for column in range(4): | |
#Cortamos la imagen y guardamos los trozos en una lsta | |
print("Row {} column {} - params {} {} {} {} ".format(row, column, size_h*row, size_w*column, size_h+(size_h*row), size_w+(size_w*column))) | |
img_aux = img.crop((size_h*row, size_w*column, size_h+(size_h*row), size_w+(size_w*column))) | |
img_aux.save("qr/img{}{}.jpg".format(row, column))# Para ver que estan todo bien | |
images_array.append(img_aux) | |
images_array = move_mosaic(images_array, fixed_pic) | |
cont_c = 0 | |
while 1: | |
mosaic = Image.new("RGB", (img.size[0], img.size[1]), "white") | |
list_gen = images_array | |
list_gen = randomList(images_array, permit_pic) | |
cont = 0 | |
for row in range(4): | |
for column in range(4): | |
mosaic.paste(list_gen[cont],(size_h*row, size_w*column, size_h+(size_h*row), size_w+(size_w*column))) | |
cont = cont + 1 | |
mosaic.save("qr/compose_aux.png") | |
qr = qrtools.QR() | |
if qr.decode("qr/compose_aux.png"): | |
print("Contador: {} Total: {} Data: {}".format(cont_c, math.factorial(len(permit_pic)), qr.data)) | |
raw_input() | |
cont_c = cont_c + 1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment