Created
November 3, 2023 03:39
-
-
Save bodqhrohro/c49d5786cf3a7c559ecdab0acdd55be8 to your computer and use it in GitHub Desktop.
Encode and decode low-bandwidth colour information in grayscale images
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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]) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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