From 1b071a46e8c9fe5912d2e59d656ea070a95d63b4 Mon Sep 17 00:00:00 2001 From: Roman Hergenreder Date: Wed, 5 Dec 2018 18:00:28 +0100 Subject: [PATCH] Progress --- .../39A25/QR3C_cropped.png | Bin 0 -> 1182 bytes .../39A25/dec17.py | 55 +++++++++++ .../39A25/dec17_out.png | 0 .../39A25/decode_qr.py | 91 ++++++++++++++++++ 4 files changed, 146 insertions(+) create mode 100644 Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/QR3C_cropped.png create mode 100755 Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/dec17.py create mode 100644 Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/dec17_out.png create mode 100755 Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/decode_qr.py diff --git a/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/QR3C_cropped.png b/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/QR3C_cropped.png new file mode 100644 index 0000000000000000000000000000000000000000..aa4863d58127bcccb5d764c87f4bf19f35f7cef6 GIT binary patch literal 1182 zcmeAS@N?(olHy`uVBq!ia0vp^&q0`j2}ov5yH?J?z>@0e;uumf=k48tdAF?u90FIr z`2T;?u8hX*mkkyye(`JWW?zNV*I3P&gN|3uTYvqvMc?)1zkmDc>-^z3EPAf^d%8@1 z;vcc~{|{dN^YyYhL;SL+su1t~te1hhwyT!9Z~d}jn%vb(i=(RQ*8jPDO5`J_nfgp_ z<@<9_ufKP6d%eT|%&2S(r7->8!gnw7&UVV5;oNsWX;16pAK!fUm{}|u(<=Q&G6#irb0PuqYbs(*=X)W82j8-`0lCIk?VD9x~0$g z{QEia{pb11wnDvwPzLkkW|ND1A0AyL=r3Qo?nlG&%(ckAM^P?w{{DoYGQSsJXbqnJ zJUb^|@jPyq{`^~YY}whr2S5GLJ=Pzw<4^_vVf#0?|Ihj@zcK%FWCZTO`}X2qj>NQc zhp)V>ocmaHoBHj~b`RgKJ@LHotKc;pffwR^{!(?x&WqppZolMuZW4O${u!IvLvMEM zX~FI5?Rqd%05}W^Uwv9D=I3(n?!RActF3n!X3_kX1_R> z@Ah_gs`;mX=XdO8|1PtAe_lSb9Diusjzib(uSFzIl;~M8ZQfGbT~jB|++VL}yDy>a z``?X=|GID7aI)Mgr1IX8-L?GF*{!2-hx~iX(w}X*`_9kM%9pRS;q(69pL*|}`kw!K z_owpDeE0CxdfegP|NX_k^f})8K2!50Zt#hW(K_ z0rRAE+~nCC?6=+fFMHhG@cqTR`#K8~cH4g{ePuM?4M&jvVYI${{0{Gu&H2D`hr!d; K&t;ucLK6T@CwV{s literal 0 HcmV?d00001 diff --git a/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/dec17.py b/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/dec17.py new file mode 100755 index 0000000..7ed45f2 --- /dev/null +++ b/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/dec17.py @@ -0,0 +1,55 @@ +#!/usr/bin/python + +from PIL import Image +from qrtools import QR +import itertools + +img = Image.open('QR3C.png') +pixels_orig = img.load() +(w,h)=img.size + +outimg = Image.new( 'RGB', (23,23), "white") +pixels_out = outimg.load() + +for i in range(0,h,6): + for j in range(0,w,6): + (r,g,b) = pixels_orig[j,i] + if((r,g,b)==(255,255,255)): + pixels_out[j/13,i/13]=(255,255,255) + + elif((r,g,b)==(0,0,0) or r>0 ): + pixels_out[j/13,i/13]=(0,0,0) + + + +# bruteforce missing section until readable +count=0 +for i in itertools.product('01', repeat=60): + count+=1 + if count%1000 ==0: + print count + + for x in range(1,12): + for y in range (10,14): + if( i[((y-10)%4)*11 + x] == '0' ): + pixels_out[x,y]=(0,0,0) + + + + + outimg=outimg.resize((300,300)) + outimg.save("dec17_out.png","png") + + + + # read qr code + nugget='' + + myCode = QR(filename="dec17_out.png") + if myCode.decode(): + nugget=myCode.data_to_string() + print nugget + break + #else: + # print "could not decode" + #break diff --git a/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/dec17_out.png b/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/dec17_out.png new file mode 100644 index 0000000..e69de29 diff --git a/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/decode_qr.py b/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/decode_qr.py new file mode 100755 index 0000000..0d355d5 --- /dev/null +++ b/Teaser/_ZOoxjUSe1OVB7OPoVrsX.pdf.extracted/39A25/decode_qr.py @@ -0,0 +1,91 @@ +#!/usr/bin/python + +from PIL import Image + +def invert(value): + return ''.join(["1" if x == "0" else "0" for x in value]) + + +# Load Image +im = Image.open('QR3C_cropped.png') +# im.crop((33, 34, 264, 265)).save("QR3C_cropped.png") + + +pix = im.load() + +tiles = 21 +tileSize = im.size[0] // tiles +version = (tiles - 17) // 4 + +data = [[0 for x in range(tiles)] for y in range(tiles)] +print("tiles=%d tileSize=%d version=%d" % (tiles, tileSize, version)) +for x in range(tiles): + for y in range(tiles): + x_mid = x * tileSize + 0.5 * tileSize + y_mid = y * tileSize + 0.5 * tileSize + color = pix[x_mid, y_mid] + # print(x, y, x_mid, y_mid, color) + data[x][y] = invert("%d%d%d" % ( color[0] // 255, color[1] // 255, color[2] // 255 )) + +# print(data) + +def blackWhiteValue(string): + new_value = "" + if len(string) % 3 != 0: + print("Cannot return black white value of", string) + return new_value + + for i in range(len(string) // 3): + new_value += string[i * 3] + + return new_value + +mask1 = [data[8][18], data[8][17], data[8][16]] +mask2 = [data[2][8], data[3][8], data[4][8]] +if mask1 != mask2: + print("masks do not match") + exit() + +# mask = [mask1[0][0] + mask1[1][0] + mask[2][0],] +mask = [''.join(mask1[i][j] for i in range(3)) for j in range(3)] +print("Mask:", mask) + +def apply_mask(x, y, bit, mask): + doInvert = False + if mask == "111": + doInvert = x % 3 == 0 + elif mask == "110": + doInvert = (x + y) % 3 == 0 + elif mask == "101": + doInvert = (x + y) % 2 == 0 + elif mask == "100": + doInvert = y % 2 == 0 + elif mask == "000": + doInvert = ((x*y) % 2) + ((x + y) % 3) == 0 + + return invert(bit) if doInvert else bit + +def get_masked_value(x, y): + return ''.join([apply_mask(x, y, data[x][y][i], mask[i]) for i in range(3)]) + +def read_block(x, y, orientation): + indizes = [] + if orientation == "UP": + indizes = [[0,0], [-1,0], [0,-1], [-1,-1], [0,-2], [-1,-2], [0, -3], [-1, -3]] + elif orientation == "LEFT": + indizes = [[0,0], [-1,0], [0,-1], [-1,-1], [-2,-1], [-3,-1], [-2, 0], [-3, 0]] + + return ''.join([get_masked_value(x + offset[0], y + offset[1]) for offset in reversed(indizes)]) + + +encoding = blackWhiteValue(data[20][20] + data[19][20] + data[20][19] + data[19][19]) +print("Encoding:", encoding) +# Alphanumeric? 11 bits per 2 character + +# for y in range(tiles): +# print(''.join(data[y])) + +block1 = read_block(20, 14, "UP") +block2 = read_block(20, 10, "LEFT") +print(block1, len(block1)) +print(block2, len(block2))