Skip to content

Instantly share code, notes, and snippets.

@bodqhrohro
Created November 3, 2023 03:39
Show Gist options
  • Save bodqhrohro/c49d5786cf3a7c559ecdab0acdd55be8 to your computer and use it in GitHub Desktop.
Save bodqhrohro/c49d5786cf3a7c559ecdab0acdd55be8 to your computer and use it in GitHub Desktop.
Encode and decode low-bandwidth colour information in grayscale images
#!/usr/bin/python
import sys
import random
from PIL import Image, ImageDraw
img = Image.open(sys.argv[1])
img = img.convert(mode='YCbCr')
width = img.width
data = img.getdata()
new_data = []
prev_row = [pixel[0] for pixel in list(data)[:width]]
prev_prev_row = prev_row
prev_prev_prev_row = prev_row
this_row = []
prev_color = 128
for i, pixel in enumerate(data):
row_number = i // width
row_position = i % width
is_even_row = row_number % 2
if row_position == 0 and i > 0:
prev_prev_prev_row = prev_prev_row
prev_prev_row = prev_row
prev_row = this_row
this_row = []
luma = pixel[0] & 243
color = 80 + ((pixel[0] >> 2 & 3) ^ 2) * 32
if is_even_row:
color = 255 - color
old_color = prev_row[row_position]
this_row.append(color)
#if color != prev_prev_row[row_position] or old_color != prev_prev_prev_row[row_position]:# or abs(color - prev_color) > 32:
#color = 128
#old_color = 128
prev_color = color
if is_even_row:
b = color
r = old_color
else:
b = old_color
r = color
# b, r = int(-0.564 * (b - luma)), int(0.713 * (r - luma))
# b, r = int(0.8 * b + 0.2 * r), int(1.2 * r - 0.2 * b)
new_data.append((luma, b, r))
img.putdata(new_data)
img.save(sys.argv[2])
#!/usr/bin/python
import sys
import random
from PIL import Image, ImageDraw
img = Image.open(sys.argv[1])
img = img.convert(mode='YCbCr')
width = img.width
data = img.getdata()
new_data = []
for i, pixel in enumerate(data):
row_number = i // width
is_even_row = row_number % 2
color = 255 - pixel[1] if is_even_row else pixel[2]
composite = (pixel[0] & 243) | ((((min(95, max(0, color - 80))) // 32) << 2) ^ 8)
new_data.append((composite, 128, 128))
img.putdata(new_data)
img = img.convert(mode='RGB')
img.save(sys.argv[2])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment