Skip to content

Commit bd1bc0b

Browse files
committed
replace PIL with cv2
1 parent ae5e101 commit bd1bc0b

File tree

7 files changed

+36
-17
lines changed

7 files changed

+36
-17
lines changed

Python/Image-Steganography/hide.py

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from PIL import Image
1+
import cv2
22
import numpy as np
33
import sys
44
from cryptography.fernet import Fernet
@@ -9,6 +9,17 @@
99
sys.exit()
1010

1111

12+
def message_to_binary(message):
13+
if type(message) == str:
14+
return ''.join([ format(ord(i), "08b") for i in message ])
15+
elif type(message) == bytes or type(message) == np.ndarray:
16+
return [ format(i, "08b") for i in message ]
17+
elif type(message) == int or type(message) == np.uint8:
18+
return format(message, "08b")
19+
else:
20+
raise TypeError("Input type not supported")
21+
22+
1223
def encrypt_message(message):
1324
key = Fernet.generate_key()
1425
encrypted_message = Fernet(key).encrypt(message.encode())
@@ -19,23 +30,23 @@ def encrypt_message(message):
1930
def hide_info(image, message):
2031

2132
enc_message, key = encrypt_message(message)
22-
image = np.array(image)
33+
enc_message = enc_message.decode()
2334

2435
max_bytes = image.shape[0] * image.shape[1] * 3//8
2536

2637
if len(enc_message) > max_bytes:
2738
raise ValueError("Insufficient bytes, provide bigger image or shorter message.")
2839

29-
enc_message += "#####".encode()
40+
enc_message += "#####"
3041

3142
data_index = 0
32-
bin_enc_message = [ format(i, "08b") for i in enc_message]
43+
bin_enc_message = message_to_binary(enc_message)
3344

3445
data_len = len(bin_enc_message)
3546

3647
for values in image:
3748
for pixel in values:
38-
r, g, b = [format(i, "08b") for i in pixel]
49+
r, g, b = message_to_binary(pixel)
3950

4051
if data_index < data_len:
4152
pixel[0] = int(r[:-1] + bin_enc_message[data_index], 2)
@@ -55,17 +66,17 @@ def hide_info(image, message):
5566
with open("key", "wb") as f:
5667
f.write(key)
5768

58-
return Image.fromarray(image)
69+
return image
5970

6071

6172
image_path = sys.argv[1]
6273
message_path = sys.argv[2]
6374

64-
source_image = Image.open(image_path, "r")
75+
source_image = cv2.imread(image_path)
6576
with open(message_path, "r") as f:
6677
message = f.read()
6778

6879
secret_image = hide_info(source_image, message)
6980
secret_image_path = image_path.split(".")
7081
secret_image_path = secret_image_path[-2]+"_secret."+secret_image_path[-1]
71-
secret_image.save(secret_image_path)
82+
cv2.imwrite(secret_image_path, secret_image)

Python/Image-Steganography/key

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
VVagxe87pFTfpWsr78zh5s6cyyzXWD4_-YMpJpB-vvI=
1+
UJRsXUb0QISvEQwbyl4M0FVhl-Xt1X_mWyjQClbT3KE=

Python/Image-Steganography/retrieve.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from cryptography.fernet import Fernet
2-
from PIL import Image
2+
import cv2
33
import numpy as np
44
import sys
55

@@ -8,8 +8,15 @@
88
sys.exit()
99

1010

11-
image_path = sys.argv[1]
12-
key_path = sys.argv[2]
11+
def message_to_binary(message):
12+
if type(message) == str:
13+
return ''.join([ format(ord(i), "08b") for i in message ])
14+
elif type(message) == bytes or type(message) == np.ndarray:
15+
return [ format(i, "08b") for i in message ]
16+
elif type(message) == int or type(message) == np.uint8:
17+
return format(message, "08b")
18+
else:
19+
raise TypeError("Input type not supported")
1320

1421

1522
def decrypt_message(enc_message, key):
@@ -20,11 +27,10 @@ def decrypt_message(enc_message, key):
2027
def retrieve_info(image, key):
2128

2229
binary_data = ""
23-
image = np.array(image)
2430

2531
for values in image:
2632
for pixel in values:
27-
r, g, b = [format(i, "08b") for i in pixel]
33+
r, g, b = message_to_binary(pixel)
2834
binary_data += r[-1]
2935
binary_data += g[-1]
3036
binary_data += b[-1]
@@ -34,15 +40,17 @@ def retrieve_info(image, key):
3440
decoded_data = ""
3541
for byte in all_bytes:
3642
decoded_data += chr(int(byte, 2))
37-
if decoded_data[-5:] == "#####".encode():
43+
if decoded_data[-5:] == "#####":
3844
break
3945

4046
message = decrypt_message(decoded_data[:-5].encode(), key)
4147

42-
return decoded_data[:-5]
48+
return message.decode()
4349

50+
image_path = sys.argv[1]
51+
key_path = sys.argv[2]
4452

45-
steg_image = Image.open(image_path, 'r')
53+
steg_image = cv2.imread(image_path)
4654
with open(key_path, "rb") as f:
4755
key = f.read()
4856

-72.6 KB
Binary file not shown.

Python/Image-Steganography/sample.png

61.8 KB
Loading
-66.9 KB
Binary file not shown.
83.8 KB
Loading

0 commit comments

Comments
 (0)