def main(): print('Opening', sys.argv[1]) print('Saving to', sys.argv[2]) with open(sys.argv[1], 'rb') as f: metalen = ord(f.read(1)) metastr = f.read(metalen) meta = json.loads(metastr) scale = float(meta['s']) n = meta['n'] llo = meta['llo'] lhi = meta['lhi'] blo = meta['blo'] bhi = meta['bhi'] alo = meta['alo'] ahi = meta['ahi'] im = Image.new('RGB', (n, n), 'black') pixels = im.load() for d in range(n*n): x, y = hilbert.d2xy(n, d) l = float(ord(f.read(1)))*(lhi - llo)/scale + llo a = float(ord(f.read(1)))*(ahi - alo)/scale + alo b = float(ord(f.read(1)))*(bhi - blo)/scale + blo rgb = color.Lab(l, a, b).toRGB() pixels[x, y] = (int(rgb.r), int(rgb.g), int(rgb.b)) im.save(sys.argv[2])
def main(): print 'Using scale', sys.argv[1] print 'Opening ', sys.argv[2] print 'Writing to ', sys.argv[3] scale = int(sys.argv[1]) im = Image.open(sys.argv[2]) pixels = im.load() width, height = im.size if width != height or not powerOfTwo(width): raise Exception('Image must be a square with sides that are powers of two') n = width colors = [] for d in range(n*n): x, y = hilbert.d2xy(n, d) r, g, b = pixels[x, y] lab = color.RGB(r, g, b).toLab() colors.append(lab) if d == 0: llo = lhi = lab.l alo = ahi = lab.a blo = bhi = lab.b else: llo, lhi = min(llo, lab.l), max(lhi, lab.l) alo, ahi = min(alo, lab.a), max(ahi, lab.a) blo, bhi = min(blo, lab.b), max(bhi, lab.b) meta = { 'llo': llo, 'lhi': lhi, 'alo': alo, 'ahi': ahi, 'blo': blo, 'bhi': bhi, 'n': n, 's': scale } metastr = json.dumps(meta) with open(sys.argv[3], 'wb') as f: f.write(chr(len(metastr))) f.write(metastr) for lab in colors: l = int(round((lab.l - llo)/(lhi - llo)*scale)) a = int(round((lab.a - alo)/(ahi - alo)*scale)) b = int(round((lab.b - blo)/(bhi - blo)*scale)) f.write(chr(l) + chr(a) + chr(b))