#!/usr/bin/env python # convert -resize 512x already-square.jpeg inimg.foo # python zord.py inimg.foo > outimg.png import Image, sys side = 9 # bits in an img side, e.g. 9 = 515*512 def dtob(n, l): # decimal (well, int type) to binary string r = '' for p in range(l): if n % 2 == 0: r = '0' + r else: r = '1' + r n >>= 1 return r def btod(b): # binary to 'decimal' int type return int(b, 2) def inter(a, b, l): # interleave bit strings r = '' for p in range(l): r += a[p] + b[p] return r def uninter(ab, l): # uninterleave bit strings # fix: len(a) and len(b) are necessarily len(ab)/2 -- # passing length argument is dumb a, b = '', '' for p in range(l): a += ab[2*p] b += ab[2*p+1] return a, b def xytoz(x, y): # z-order int to x,y coords return inter(dtob(x, side), dtob(y, side)) def ztoxy(z): # x,y coords to z-order int x, y = uninter(dtob(z, side*2), side) return btod(x), btod(y) plain = Image.open(sys.argv[1]).load() outf = Image.new('RGB', (2**side, 2**side)) out = outf.load() for y in range(2**side): for x in range(2**side): target = ztoxy(y*(2**side) + x) out[x, y] = plain[target[0], target[1]] outf.save(sys.stdout, "PNG")