-
Notifications
You must be signed in to change notification settings - Fork 0
/
implementation.py
103 lines (76 loc) · 2.31 KB
/
implementation.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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
from PIL import Image
def convert_data(data):
new_data = []
for i in data:
new_data.append(format(ord(i), '08b'))
return new_data
def mod_pixel(pix, data):
datalist = convert_data(data)
lendata = len(datalist)
imdata = iter(pix)
for i in range(lendata):
pix = [value for value in imdata.__next__()[:3] +
imdata.__next__()[:3] +
imdata.__next__()[:3]]
for j in range(0, 8):
if (datalist[i][j] == '0') and (pix[j] % 2 != 0):
if (pix[j] % 2 != 0):
pix[j] -= 1
elif (datalist[i][j] == '1') and (pix[j] % 2 == 0):
pix[j] -= 1
if (i == lendata - 1):
if (pix[-1] % 2 == 0):
pix[-1] -= 1
else:
if (pix[-1] % 2 != 0):
pix[-1] -= 1
pix = tuple(pix)
yield pix[0:3]
yield pix[3:6]
yield pix[6:9]
def encode_enc(newimg, data):
w = newimg.size[0]
(x, y) = (0, 0)
for pixel in mod_pixel(newimg.getdata(), data):
newimg.putpixel((x, y), pixel)
if (x == w - 1):
x = 0
y += 1
else:
x += 1
def encode():
img = input("Enter full image name: ")
image = Image.open(img, 'r')
data = input("Enter data: ")
if (len(data) == 0):
raise ValueError('cannot encode empty')
newimg = image.copy()
encode_enc(newimg, data)
new_img_name = input("Enter full name of encoded image : ")
newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))
def decode():
img = input("Enter full image name :")
image = Image.open(img, 'r')
data = ''
imgdata = iter(image.getdata())
while (True):
pixels = [value for value in imgdata.__next__()[:3] +
imgdata.__next__()[:3] +
imgdata.__next__()[:3]]
binstr = ''
for i in pixels[:8]:
if (i % 2 == 0):
binstr += '0'
else:
binstr += '1'
data += chr(int(binstr, 2))
if (pixels[-1] % 2 != 0):
return data
def main():
a = input("1. encode \ 2. decode: ")
if (a == '1'):
encode()
elif (a == '2'):
print("Decoded data: " + decode())
if __name__ == '__main__':
main()