-
Notifications
You must be signed in to change notification settings - Fork 0
/
ricky.py
50 lines (40 loc) · 2.96 KB
/
ricky.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
from PIL import Image
import click
@click.group()
def cli():
pass
@cli.command()
@click.argument("input", type=click.Path(exists=True))
@click.argument("output", type=click.Path())
def extract(input, output):
image = Image.open(input)
image.info = {}
w, h = image.size
extracted_image = Image.new(image.mode, (w//2, h//2), "white")
for x in range(w//2):
for y in range(h//2):
extracted_image.putpixel((x,y), image.getpixel((x*2,y*2)))
print(f"Saving output image ({w//2}x{h//2}) as \"{output}\"")
extracted_image.save(output)
@cli.command()
@click.argument("master", type=click.Path(exists=True))
@click.argument("embedding", type=click.Path(exists=True))
@click.argument("output", type=click.Path())
def embed(master, embedding, output):
master_image = Image.open(master)
embedding_image = Image.open(embedding)
w, h = embedding_image.size
master_image = master_image.resize((w * 2, h * 2))
master_image = master_image.point(lambda data: data * 0.8) # Slightly lower master image brightness
# Embed pixels
for x in range(w):
for y in range(h):
master_image.putpixel((x*2,y*2), embedding_image.getpixel((x,y)))
# Apply magic color profile
master_image.info = {
'icc_profile': b'\x00\x00\x01\xe0\x00\x00\x00\x00\x02\x00\x00\x00mntrRGB XYZ \x07\xd0\x00\x01\x00\x01\x00\x00\x00\x00\x00\x00acspMSFT\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xf6\xd6\x00\x01\x00\x00\x00\x00\xd3-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\twtpt\x00\x00\x00\xf0\x00\x00\x00\x14rTRC\x00\x00\x01\x04\x00\x00\x00\x0egTRC\x00\x00\x01\x14\x00\x00\x00\x0ebTRC\x00\x00\x01$\x00\x00\x00\x0erXYZ\x00\x00\x014\x00\x00\x00\x14gXYZ\x00\x00\x01H\x00\x00\x00\x14bXYZ\x00\x00\x01\\\x00\x00\x00\x14cprt\x00\x00\x01p\x00\x00\x00\tdesc\x00\x00\x01\x80\x00\x00\x00`XYZ \x00\x00\x00\x00\x00\x00\xf3Q\x00\x01\x00\x00\x00\x01\x16\xcccurv\x00\x00\x00\x00\x00\x00\x00\x01\n\x00\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\n\x00\x00\x00curv\x00\x00\x00\x00\x00\x00\x00\x01\n\x00\x00\x00XYZ \x00\x00\x00\x00\x00\x00o\x9f\x00\x008\xf4\x00\x00\x03\x90XYZ \x00\x00\x00\x00\x00\x00b\x95\x00\x00\xb7\x86\x00\x00\x18\xdbXYZ \x00\x00\x00\x00\x00\x00$\xa1\x00\x00\x0f\x85\x00\x00\xb6\xd5text\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00desc\x00\x00\x00\x00\x00\x00\x00\x06opRGB\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
}
print(f"Saving output image ({w*2}x{h*2}) as \"{output}\"")
master_image.save(output)
if __name__ == "__main__":
cli()