summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--grafitroniks-shred.pngbin0 -> 546357 bytes
-rw-r--r--paris-shred.pngbin0 -> 1021152 bytes
-rw-r--r--paris-shred2.pngbin0 -> 1018654 bytes
-rw-r--r--reshredded.pngbin617339 -> 0 bytes
-rwxr-xr-xrun.sh7
-rw-r--r--tokyo-shred.png (renamed from TokyoPanoramaShredded.png)bin617432 -> 617432 bytes
-rw-r--r--tokyo-shred2.pngbin0 -> 617367 bytes
-rwxr-xr-xunshred-binary-merge-failure.py12
-rwxr-xr-xunshred.py33
9 files changed, 35 insertions, 17 deletions
diff --git a/grafitroniks-shred.png b/grafitroniks-shred.png
new file mode 100644
index 0000000..4373a33
--- /dev/null
+++ b/grafitroniks-shred.png
Binary files differ
diff --git a/paris-shred.png b/paris-shred.png
new file mode 100644
index 0000000..58cdfe2
--- /dev/null
+++ b/paris-shred.png
Binary files differ
diff --git a/paris-shred2.png b/paris-shred2.png
new file mode 100644
index 0000000..3c204d1
--- /dev/null
+++ b/paris-shred2.png
Binary files differ
diff --git a/reshredded.png b/reshredded.png
deleted file mode 100644
index ec1e05f..0000000
--- a/reshredded.png
+++ /dev/null
Binary files differ
diff --git a/run.sh b/run.sh
new file mode 100755
index 0000000..8d2ec91
--- /dev/null
+++ b/run.sh
@@ -0,0 +1,7 @@
+#!/bin/sh
+mkdir test
+for i in *.png; do
+ ./unshred.py "$i" "test/$i-unshred.png"
+done
+gwenview *.png test/*.png 2>/dev/null
+rm -rf test \ No newline at end of file
diff --git a/TokyoPanoramaShredded.png b/tokyo-shred.png
index be74187..be74187 100644
--- a/TokyoPanoramaShredded.png
+++ b/tokyo-shred.png
Binary files differ
diff --git a/tokyo-shred2.png b/tokyo-shred2.png
new file mode 100644
index 0000000..282f400
--- /dev/null
+++ b/tokyo-shred2.png
Binary files differ
diff --git a/unshred-binary-merge-failure.py b/unshred-binary-merge-failure.py
index abb19c5..b8dc3c8 100755
--- a/unshred-binary-merge-failure.py
+++ b/unshred-binary-merge-failure.py
@@ -1,6 +1,6 @@
#!/usr/bin/env python
-# Instagram Unshredder -- Binary Simplify Failure
+# Instagram Unshredder - Binary Simplifier
# by Jason A. Donenfeld <Jason@zx2c4.com>
# for http://instagram-engineering.tumblr.com/post/12651721845/instagram-engineering-challenge-the-unshredder
@@ -29,10 +29,14 @@ def pixel_distance(a, b):
def match_score(left, right):
left = left[len(left) - 1]
right = right[0]
- total = 0
+ straight = 0
for i in xrange(0, image.size[1]):
- total += pixel_distance(pixel((left + 1) * shred_width - 1, i), pixel(right * shred_width, i))
- return total
+ straight += pixel_distance(pixel((left + 1) * shred_width - 1, i), pixel(right * shred_width, i))
+ shifted = 0
+ offset = image.size[1] / 35
+ for i in xrange(offset, image.size[1] - offset):
+ shifted += pixel_distance(pixel((left + 1) * shred_width - 1, i + offset), pixel(right * shred_width, i - offset))
+ return straight / shifted
def binary_simplify(order_lists):
simplified = list()
blacklist = list()
diff --git a/unshred.py b/unshred.py
index ea20810..98b5fc5 100755
--- a/unshred.py
+++ b/unshred.py
@@ -17,11 +17,14 @@ image = Image.open(argv[1])
data = image.getdata()
def pixel(x, y):
- pixel = data[y * image.size[0] + x]
- return pixel
+ return data[y * image.size[0] + x]
def pixel_distance(a, b):
- opacity_a = a[3] / 255
- opacity_b = b[3] / 255
+ try:
+ opacity_a = a[3] / 255
+ opacity_b = b[3] / 255
+ except:
+ opacity_a = 1
+ opacity_b = 1
a_r, a_g, a_b = (a[0] * opacity_a, a[1] * opacity_a, a[2] * opacity_a)
b_r, b_g, b_b = (b[0] * opacity_b, b[1] * opacity_b, b[2] * opacity_b)
return sqrt((a_r - b_r) ** 2 + (a_g - b_g) ** 2 + (a_b - b_b) ** 2)
@@ -31,9 +34,9 @@ for col in xrange(0, image.size[0] - 1):
for row in xrange(0, image.size[1]):
columns[col] += pixel_distance(pixel(col, row), pixel(col + 1, row))
shred_width = -1
-for factor in xrange(2, image.size[0]):
+for factor in xrange(2, image.size[0] / 2):
if image.size[0] % factor != 0: # Poor man's factorization! R.I.P. Sieve. Sorry instagram.
- continue # I'm also ignoring your guidelines about divisibility by 2.
+ continue
last_col = 0
success = True
for col in xrange(0, image.size[0], factor):
@@ -55,13 +58,17 @@ if shred_width == -1:
exit(-2)
columns = image.size[0] / shred_width
-print "The image has %d columns." % columns
+print "%s image has %d columns." % (argv[1], columns)
def match_score(left, right):
- total = 0
+ straight = 0
for i in xrange(0, image.size[1]):
- total += pixel_distance(pixel((left + 1) * shred_width - 1, i), pixel(right * shred_width, i))
- return total
+ straight += pixel_distance(pixel((left + 1) * shred_width - 1, i), pixel(right * shred_width, i))
+ shifted = 0
+ offset = image.size[1] / 35
+ for i in xrange(offset, image.size[1] - offset):
+ shifted += pixel_distance(pixel((left + 1) * shred_width - 1, i + offset), pixel(right * shred_width, i - offset))
+ return straight / shifted
column_matches = {}
for i in xrange(0, columns):
@@ -90,10 +97,10 @@ for key, value in column_matches.iteritems():
break
# Otherwise, if it amazingly wraps around, let's just remove the weakest link.
if last == -1:
- min_score = image.size[1] * 442 # = sqrt(3) * 255
+ max_score = 0
for key, value in column_matches.iteritems():
- if value[1] < min_score:
- min_score = value[1]
+ if value[1] > max_score:
+ max_score = value[1]
last = value[0]
del column_matches[last]